dotnetreport-ng 6.2.1 → 6.2.2-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dotnetreport-ng-6.2.2-beta.tgz +0 -0
- package/fesm2022/dotnetreport-ng.mjs +170 -209
- package/fesm2022/dotnetreport-ng.mjs.map +1 -1
- package/index.d.ts +68 -5
- package/package.json +4 -6
- package/dotnetreport-ng-6.2.1.tgz +0 -0
- package/esm2022/dotnetreport-ng.mjs +0 -5
- package/esm2022/lib/dotnetdashboard/dotnetdashboard.component.mjs +0 -3246
- package/esm2022/lib/dotnetreport/dotnetreport.component.mjs +0 -3202
- package/esm2022/lib/dotnetreport-lib.di.mjs +0 -3
- package/esm2022/lib/dotnetreport-lib.module.mjs +0 -46
- package/esm2022/lib/dotnetreport-lib.service.mjs +0 -15
- package/esm2022/lib/dotnetsetup/dotnetsetup.component.mjs +0 -3192
- package/esm2022/public-api.mjs +0 -9
- package/lib/dotnetdashboard/dotnetdashboard.component.d.ts +0 -24
- package/lib/dotnetreport/dotnetreport.component.d.ts +0 -23
- package/lib/dotnetreport-lib.di.d.ts +0 -2
- package/lib/dotnetreport-lib.module.d.ts +0 -12
- package/lib/dotnetreport-lib.service.d.ts +0 -6
- package/lib/dotnetsetup/dotnetsetup.component.d.ts +0 -22
- package/public-api.d.ts +0 -5
|
@@ -1,3246 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { BASE_URL_TOKEN } from './../dotnetreport-lib.di';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/platform-browser";
|
|
5
|
-
import * as i2 from "@angular/common/http";
|
|
6
|
-
import * as i3 from "@angular/router";
|
|
7
|
-
export class DotnetdashboardComponent {
|
|
8
|
-
sanitizer;
|
|
9
|
-
cdref;
|
|
10
|
-
baseUrl;
|
|
11
|
-
http;
|
|
12
|
-
route;
|
|
13
|
-
baseServiceUrl;
|
|
14
|
-
reportTemplates;
|
|
15
|
-
queryParams;
|
|
16
|
-
constructor(injector, sanitizer, cdref, baseUrl, http, route) {
|
|
17
|
-
this.sanitizer = sanitizer;
|
|
18
|
-
this.cdref = cdref;
|
|
19
|
-
this.baseUrl = baseUrl;
|
|
20
|
-
this.http = http;
|
|
21
|
-
this.route = route;
|
|
22
|
-
this.baseServiceUrl = this.baseUrl + '/api'; // "http://localhost:39378"; \
|
|
23
|
-
this.reportTemplates = "";
|
|
24
|
-
}
|
|
25
|
-
ngOnInit() {
|
|
26
|
-
var reports = [];
|
|
27
|
-
var dashboards = [];
|
|
28
|
-
var adminMode = localStorage.getItem('reportAdminMode') ?? false;
|
|
29
|
-
let getDashboardsUrl = this.baseServiceUrl + "/DotNetReportApi/GetDashboards?adminMode=" + adminMode;
|
|
30
|
-
let loadSavedDashboard = this.baseServiceUrl + "/DotNetReportApi/LoadSavedDashboard";
|
|
31
|
-
let getUsersAndRolesUrl = this.baseServiceUrl + "/DotNetReportApi/GetUsersAndRoles";
|
|
32
|
-
getUsersAndRolesUrl = getUsersAndRolesUrl.replace(/[?&]$/, "");
|
|
33
|
-
this.http.get(getDashboardsUrl).subscribe((dashboardData) => {
|
|
34
|
-
dashboardData.forEach((d) => {
|
|
35
|
-
dashboards.push({ id: d.Id, name: d.Name, description: d.Description, selectedReports: d.SelectedReports, schedule: d.Schedule, userId: d.UserId, userRoles: d.UserRoles, viewOnlyUserId: d.ViewOnlyUserId, viewOnlyUserRoles: d.ViewOnlyUserRoles, clientId: d.ClientId, canManage: d.CanManage });
|
|
36
|
-
});
|
|
37
|
-
this.queryParams = this.route.snapshot.queryParams;
|
|
38
|
-
var dashboardId = parseInt(this.queryParams['id'] || '0');
|
|
39
|
-
if (!dashboardId && dashboards.length > 0) {
|
|
40
|
-
dashboardId = dashboards[0].id;
|
|
41
|
-
}
|
|
42
|
-
this.http.get(loadSavedDashboard + "?id=" + dashboardId).subscribe((reportsData) => {
|
|
43
|
-
reportsData.forEach((r) => {
|
|
44
|
-
reports.push({ reportSql: r.ReportSql, reportId: r.ReportId, reportFilter: r.ReportFilter, connectKey: r.ConnectKey, x: r.X, y: r.Y, width: r.Width, height: r.Height });
|
|
45
|
-
});
|
|
46
|
-
this.http.get(getUsersAndRolesUrl).subscribe((response) => {
|
|
47
|
-
let result = response;
|
|
48
|
-
let vm = new dashboardViewModel({
|
|
49
|
-
runReportUrl: this.baseServiceUrl + '/DotNetReport/Report',
|
|
50
|
-
execReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReport',
|
|
51
|
-
runLinkReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportLink',
|
|
52
|
-
reportWizard: $("#modal-reportbuilder"),
|
|
53
|
-
lookupListUrl: this.baseServiceUrl + '/DotNetReportApi/GetLookupList',
|
|
54
|
-
apiUrl: this.baseServiceUrl + '/DotNetReportApi/CallReportApi',
|
|
55
|
-
runReportApiUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportApi',
|
|
56
|
-
getSchemaFromSql: this.baseServiceUrl + '/DotNetReportApi/GetSchemaFromSql',
|
|
57
|
-
reportMode: "execute",
|
|
58
|
-
linkModal: $("#linkModal"),
|
|
59
|
-
fieldOptionsModal: $("#fieldOptionsModal"),
|
|
60
|
-
reports: reports,
|
|
61
|
-
dashboards: dashboards,
|
|
62
|
-
userSettings: result,
|
|
63
|
-
users: result.users,
|
|
64
|
-
userRoles: result.userRoles,
|
|
65
|
-
allowAdmin: result.allowAdminMode,
|
|
66
|
-
dataFilters: result.dataFilters,
|
|
67
|
-
dashboardId: dashboardId,
|
|
68
|
-
runExportUrl: this.baseServiceUrl + '/DotNetReportApi/',
|
|
69
|
-
printReportUrl: this.baseUrl + '/DotNetReport/ReportPrint',
|
|
70
|
-
loadSavedDashbordUrl: this.baseServiceUrl + '/DotNetReportApi/LoadSavedDashboard',
|
|
71
|
-
getDashbordsUrl: this.baseServiceUrl + '/DotNetReportApi/GetDashboards',
|
|
72
|
-
getTimeZonesUrl: this.baseServiceUrl + '/DotNetReportApi/GetAllTimezones',
|
|
73
|
-
getUsersAndRolesUrl: getUsersAndRolesUrl,
|
|
74
|
-
samePageOnRun: true,
|
|
75
|
-
});
|
|
76
|
-
vm.init(0, result.noAccount).done(() => {
|
|
77
|
-
this.renderKOTemplates();
|
|
78
|
-
ko.applyBindings(vm, document.getElementById('dot-net-report'));
|
|
79
|
-
this.bindGridInit(vm);
|
|
80
|
-
this.bindWindowResize(vm);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
ngOnDestroy() {
|
|
87
|
-
ko.cleanNode(document.getElementById('dot-net-report'));
|
|
88
|
-
}
|
|
89
|
-
init() {
|
|
90
|
-
this.ngOnInit();
|
|
91
|
-
}
|
|
92
|
-
renderKOTemplates() {
|
|
93
|
-
this.reportTemplates = this.sanitizer.bypassSecurityTrustHtml(`<!-- Dotnet Report HTML Templates -->
|
|
94
|
-
<script type="text/html" id="report-filter">
|
|
95
|
-
<div class="form-group" data-bind="attr: {id: 'filter-'+uiId }">
|
|
96
|
-
<!-- ko if: !hasForeignKey-->
|
|
97
|
-
<!-- ko if: ['DateTime','Date','Time'].indexOf(fieldType) != -1 -->
|
|
98
|
-
<div style="display: flex; align-items: center; gap: 8px;">
|
|
99
|
-
<!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 -->
|
|
100
|
-
<input class="form-control" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" required />
|
|
101
|
-
<!-- ko if: fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
|
|
102
|
-
<input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
|
|
103
|
-
<!-- /ko -->
|
|
104
|
-
<!-- /ko -->
|
|
105
|
-
</div>
|
|
106
|
-
<!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
|
|
107
|
-
From
|
|
108
|
-
<div style="display: flex; align-items: center; gap: 8px;">
|
|
109
|
-
<input required class="form-control from-date" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" />
|
|
110
|
-
<!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
|
|
111
|
-
<input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
|
|
112
|
-
<!-- /ko -->
|
|
113
|
-
</div>
|
|
114
|
-
to
|
|
115
|
-
<div style="display: flex; align-items: center; gap: 8px;">
|
|
116
|
-
<input data-bind="datepicker: $parent.fmtValue2, datepickerOptions: {value: $parent.Value2, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" class="form-control to-date" required />
|
|
117
|
-
<!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
|
|
118
|
-
<input class="form-control" type="time" data-bind="value:$parent.Valuetime2" required>
|
|
119
|
-
<!-- /ko -->
|
|
120
|
-
</div>
|
|
121
|
-
<!-- /ko -->
|
|
122
|
-
<!-- ko if: ['range'].indexOf($parent.Operator()) != -1 -->
|
|
123
|
-
<select data-bind="value: $parent.Value" class="form-select" required>
|
|
124
|
-
<option value=""></option>
|
|
125
|
-
<option>Today</option>
|
|
126
|
-
<option>Today +</option>
|
|
127
|
-
<option>Today -</option>
|
|
128
|
-
<option>Yesterday</option>
|
|
129
|
-
<option>This Week</option>
|
|
130
|
-
<option>Last Week</option>
|
|
131
|
-
<option>This Month</option>
|
|
132
|
-
<option>Last Month</option>
|
|
133
|
-
<option>This Year</option>
|
|
134
|
-
<option>Last Year</option>
|
|
135
|
-
<option>This Week To Date</option>
|
|
136
|
-
<option>This Month To Date</option>
|
|
137
|
-
<option>This Year To Date</option>
|
|
138
|
-
<option>Last 30 Days</option>
|
|
139
|
-
<!--<option>This Month Last Year</option>
|
|
140
|
-
<option>Last Month Last Year</option>
|
|
141
|
-
<option>This Quarter</option>
|
|
142
|
-
<option>Last Quarter</option>
|
|
143
|
-
<option>First Quarter</option>
|
|
144
|
-
<option>Second Quarter</option>
|
|
145
|
-
<option>Third Quarter</option>
|
|
146
|
-
<option>Fourth Quarter</option>
|
|
147
|
-
<option>Next 6 Months</option>
|
|
148
|
-
<option>Last 6 Months</option>
|
|
149
|
-
<option>2 Years ago</option>
|
|
150
|
-
<option>3 Years ago</option>
|
|
151
|
-
<option>4 Years ago</option>
|
|
152
|
-
<option>5 Years ago</option>-->
|
|
153
|
-
<optgroup label="Comparison Options">
|
|
154
|
-
<option>>= Today</option>
|
|
155
|
-
<option><= Today</option>
|
|
156
|
-
<option>>= Today +</option>
|
|
157
|
-
<option><= Today +</option>
|
|
158
|
-
<option>>= Today -</option>
|
|
159
|
-
<option><= Today -</option>
|
|
160
|
-
</optgroup>
|
|
161
|
-
</select>
|
|
162
|
-
<div data-bind="if: $parent.Value().indexOf('Today +') >= 0 || $parent.Value().indexOf('Today -') >= 0" class="form-group pull-left" style="padding-top: 5px;">
|
|
163
|
-
<input type="number" class="form-control input-sm pull-left" style="width: 80px;" data-bind="value: $parent.Value2" required /><span style="padding: 5px 5px;" class="pull-left"> days</span>
|
|
164
|
-
</div>
|
|
165
|
-
<!-- /ko -->
|
|
166
|
-
<!-- /ko -->
|
|
167
|
-
<!-- ko if: ['Int','Money','Float','Double'].indexOf(fieldType) != -1 -->
|
|
168
|
-
<!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
|
|
169
|
-
<input class="form-control" type="number" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'" required />
|
|
170
|
-
<!-- /ko -->
|
|
171
|
-
<!-- ko if: ['in', 'not in'].indexOf($parent.Operator()) != -1 -->
|
|
172
|
-
<input class="form-control" type="text" data-bind="value: $parent.Value" required />
|
|
173
|
-
<!-- /ko -->
|
|
174
|
-
<!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
|
|
175
|
-
From
|
|
176
|
-
<input class="form-control" type="number" data-bind="value: $parent.Value" required />
|
|
177
|
-
To
|
|
178
|
-
<input class="form-control" type="number" data-bind="value: $parent.Value2" required />
|
|
179
|
-
<!-- /ko -->
|
|
180
|
-
<!-- /ko -->
|
|
181
|
-
<!-- ko if: fieldType=='Boolean' && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
|
|
182
|
-
<select required class="form-select" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'">
|
|
183
|
-
<option value="1">Yes</option>
|
|
184
|
-
<option value="0">No</option>
|
|
185
|
-
</select>
|
|
186
|
-
<!-- /ko -->
|
|
187
|
-
<!-- ko if: ['Int','Money','Float','Double','Date','DateTime','Time','Boolean'].indexOf(fieldType) == -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
|
|
188
|
-
<input class="form-control" type="text" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default',attr: {id: 'ctl-' + $element.closest('[data-parentprefix]').getAttribute('data-parentprefix') + '-' + uiId}" required />
|
|
189
|
-
<!-- /ko -->
|
|
190
|
-
<!-- /ko -->
|
|
191
|
-
<!-- ko if: hasForeignKey && $parent.Operator() != 'all' -->
|
|
192
|
-
<!-- ko if: hasForeignParentKey && $parent.showParentFilter() -->
|
|
193
|
-
<select multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.ParentList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ParentIn"></select>
|
|
194
|
-
<!-- /ko -->
|
|
195
|
-
<!-- ko if: $parent.Operator()=='='-->
|
|
196
|
-
<select required class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', value: $parent.Value, optionsCaption: 'Please Choose'"></select>
|
|
197
|
-
<!-- /ko -->
|
|
198
|
-
<!-- ko if: $parent.Operator()=='in' || $parent.Operator()=='not in'-->
|
|
199
|
-
<select required multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ValueIn"></select>
|
|
200
|
-
<!-- /ko -->
|
|
201
|
-
<!-- /ko -->
|
|
202
|
-
</div>
|
|
203
|
-
</script>
|
|
204
|
-
|
|
205
|
-
<script type="text/html" id="pager-template">
|
|
206
|
-
<div class="pager-container d-flex align-items-center flex-wrap gap-2">
|
|
207
|
-
|
|
208
|
-
<!-- Rows per page -->
|
|
209
|
-
<div class="d-flex align-items-center gap-1 ms-1">
|
|
210
|
-
<span class="text-muted small">Page size:</span>
|
|
211
|
-
<select class="form-select form-select-sm w-auto"
|
|
212
|
-
data-bind="options: pageSizeOptions, value: pageSize">
|
|
213
|
-
</select>
|
|
214
|
-
</div>
|
|
215
|
-
|
|
216
|
-
<!-- Inner border block for page navigation controls -->
|
|
217
|
-
<div class="d-flex align-items-center gap-1 ms-3">
|
|
218
|
-
<a href="#" title="First" data-bind="click: first, enable: !isFirstPage()"
|
|
219
|
-
class="btn btn-outline-secondary btn-sm pager-btn ms-1" aria-label="First Page">
|
|
220
|
-
<i class="fa fa-angle-double-left"></i>
|
|
221
|
-
</a>
|
|
222
|
-
|
|
223
|
-
<a href="#" title="Previous" data-bind="click: previous, enable: !isFirstPage()"
|
|
224
|
-
class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Previous Page">
|
|
225
|
-
<i class="fa fa-angle-left"></i>
|
|
226
|
-
</a>
|
|
227
|
-
|
|
228
|
-
<div class="d-flex align-items-center gap-1">
|
|
229
|
-
<span class="text-muted small">Page</span>
|
|
230
|
-
<input type="number" min="1" pattern="[0-9]*"
|
|
231
|
-
class="form-control form-control-sm text-center pager-input"
|
|
232
|
-
style="width: 60px;"
|
|
233
|
-
data-bind="value: currentPage, attr: { max: pages() }">
|
|
234
|
-
<span class="text-muted small">of</span>
|
|
235
|
-
<span class="text-muted small" data-bind="text: pages"></span>
|
|
236
|
-
</div>
|
|
237
|
-
|
|
238
|
-
<a href="#" title="Next" data-bind="click: next, enable: !isLastPage()"
|
|
239
|
-
class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Next Page">
|
|
240
|
-
<i class="fa fa-angle-right"></i>
|
|
241
|
-
</a>
|
|
242
|
-
|
|
243
|
-
<a href="#" title="Last" data-bind="click: last, enable: !isLastPage()"
|
|
244
|
-
class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Last Page">
|
|
245
|
-
<i class="fa fa-angle-double-right"></i>
|
|
246
|
-
</a>
|
|
247
|
-
</div>
|
|
248
|
-
</div>
|
|
249
|
-
</script>
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
<script type="text/html" id="report-column-header">
|
|
254
|
-
<!-- ko foreach: Columns -->
|
|
255
|
-
<th data-bind="attr: { id: !IsPivotField ? fieldId : 'pivot--' + fieldName }, style: {'text-align': fieldAlign() ? fieldAlign() : (IsNumeric ? 'right' : 'left'), 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
|
|
256
|
-
|
|
257
|
-
<div class="pull-left" data-bind="if: !$parent.IsDrillDown()" style="padding-right: 5px;">
|
|
258
|
-
<div class="dropup">
|
|
259
|
-
<a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
|
|
260
|
-
<span class="fa fa-ellipsis-v sortable" title="Drag to reorder"></span>
|
|
261
|
-
</a>
|
|
262
|
-
<ul data-bind="visible: !IsPivotField" class="dropdown-menu" style="z-index: 1001;">
|
|
263
|
-
<li class="dropdown-item small" data-bind="visible: !IsNumeric">
|
|
264
|
-
<a href="#" data-bind="click: toggleOuterGroup">
|
|
265
|
-
<span class="fa fa-clone"></span> Outer Group
|
|
266
|
-
</a>
|
|
267
|
-
</li>
|
|
268
|
-
<li class="dropdown-item small">
|
|
269
|
-
<a href="#" data-bind="click: setupFieldOptions">
|
|
270
|
-
<span class="fa fa-gear"></span> Field Settings
|
|
271
|
-
</a>
|
|
272
|
-
</li>
|
|
273
|
-
</ul>
|
|
274
|
-
</div>
|
|
275
|
-
</div>
|
|
276
|
-
<div data-bind="style: {'width': fieldWidth}">
|
|
277
|
-
<!-- ko if: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
|
|
278
|
-
<span data-bind="text: fieldLabel() ? fieldLabel() : fieldName, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
|
|
279
|
-
<!-- /ko -->
|
|
280
|
-
<!-- ko ifnot: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
|
|
281
|
-
<a href="" data-bind="click: function(){ if (!IsPivotField) { $parents[pagerIndex($parents)].changeSort(SqlField); } }, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}">
|
|
282
|
-
<span data-bind="text: $parent.IsDrillDown() && fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName)"></span>
|
|
283
|
-
<span data-bind="text: $parents[pagerIndex($parents)].pager.sortColumn() === SqlField ? ($parents[pagerIndex($parents)].pager.sortDescending() ? '▼' : '▲') : ''"></span>
|
|
284
|
-
</a>
|
|
285
|
-
<!-- /ko -->
|
|
286
|
-
</div>
|
|
287
|
-
</th>
|
|
288
|
-
<!-- /ko -->
|
|
289
|
-
</script>
|
|
290
|
-
|
|
291
|
-
<script type="text/html" id="report-widget">
|
|
292
|
-
<div style="text-align: center; width: 100%;font-size: 48px">
|
|
293
|
-
<span data-bind="visible: Rows.length < 1" title="No data found">/</span>
|
|
294
|
-
|
|
295
|
-
<div data-bind="if: Rows.length > 0">
|
|
296
|
-
<div data-bind="with: $parent.rows[0].Items[0]">
|
|
297
|
-
<span data-bind="html: formattedVal"></span>
|
|
298
|
-
|
|
299
|
-
<!-- ko if: $parent.Rows.length > 1 ? ($parents[$parents.length-2].showPriorInKpi != undefined ? $parents[$parents.length-2].showPriorInKpi() : $parents[$parents.length-1].showPriorInKpi()) : false -->
|
|
300
|
-
<span data-bind="style: {'color': $parent.calculateRate() > 0 ? 'green' : 'red', 'font-size': '24px'}">
|
|
301
|
-
<span data-bind="html: $parent.calculateRate() + '%'"></span>
|
|
302
|
-
</span>
|
|
303
|
-
|
|
304
|
-
<div data-bind="style: {'font-size': '24px', 'color': 'gray'}, css: {'text-muted': true}">
|
|
305
|
-
Prior Period: <span data-bind="html: $parent.Rows[1].Items[0].formattedVal"></span>
|
|
306
|
-
</div>
|
|
307
|
-
<!-- /ko -->
|
|
308
|
-
|
|
309
|
-
</div>
|
|
310
|
-
</div>
|
|
311
|
-
</div>
|
|
312
|
-
|
|
313
|
-
</script>
|
|
314
|
-
|
|
315
|
-
<script type="text/html" id="report-column">
|
|
316
|
-
<!-- ko foreach: Items -->
|
|
317
|
-
<td data-bind="hidden: outerGroup, style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : (Column.IsNumeric ? 'right' : 'left')}">
|
|
318
|
-
<div data-bind="style: {'width': fieldWidth }, css: { 'text-wrap': fieldWidth }">
|
|
319
|
-
<!-- ko if: LinkTo-->
|
|
320
|
-
<a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
|
|
321
|
-
<!-- /ko-->
|
|
322
|
-
<!-- ko ifnot: LinkTo-->
|
|
323
|
-
<span data-bind="html: formattedVal"></span>
|
|
324
|
-
<!-- /ko-->
|
|
325
|
-
</div>
|
|
326
|
-
</td>
|
|
327
|
-
</script>
|
|
328
|
-
|
|
329
|
-
<script type="text/html" id="report-pivot">
|
|
330
|
-
<div class="table-responsive" data-bind="with: ReportData">
|
|
331
|
-
<table class="table table-striped table-hover table-condensed">
|
|
332
|
-
<thead style="position: sticky; top: -1px; z-index: 2;">
|
|
333
|
-
<tr>
|
|
334
|
-
<th></th>
|
|
335
|
-
<!-- ko foreach: Rows -->
|
|
336
|
-
<th>
|
|
337
|
-
<span data-bind="text: Items[0].FormattedValue"></span>
|
|
338
|
-
</th>
|
|
339
|
-
<!-- /ko -->
|
|
340
|
-
</tr>
|
|
341
|
-
</thead>
|
|
342
|
-
<tbody data-bind="foreach: Columns">
|
|
343
|
-
<tr>
|
|
344
|
-
<!-- ko if: $index() > 0 -->
|
|
345
|
-
<td>
|
|
346
|
-
<span data-bind="text: fieldLabel || ColumnName"></span>
|
|
347
|
-
</td>
|
|
348
|
-
<!-- ko foreach: $parent.Rows -->
|
|
349
|
-
<td data-bind="style: {'background-color': $parent.backColor, 'color': $parent.fontColor, 'font-weight': $parent.fontBold() ? 'bold' : 'normal', 'text-align': $parent.fieldAlign ? $parent.fieldAlign : ($parent.IsNumeric ? 'right' : 'left') }">
|
|
350
|
-
<span data-bind="text: Items[$parentContext.$index()].FormattedValue"></span>
|
|
351
|
-
</td>
|
|
352
|
-
<!-- /ko -->
|
|
353
|
-
<!-- /ko -->
|
|
354
|
-
</tr>
|
|
355
|
-
</tbody>
|
|
356
|
-
</table>
|
|
357
|
-
|
|
358
|
-
</div>
|
|
359
|
-
|
|
360
|
-
</script>
|
|
361
|
-
|
|
362
|
-
<script type="text/html" id="report-table">
|
|
363
|
-
<div class="table-responsive">
|
|
364
|
-
<table class="table table-hover table-condensed" data-bind="attr: {class: 'table table-striped table-hover table-condensed ' + $parents[2].selectedStyle()}">
|
|
365
|
-
<thead style="position: sticky; top: -1px; z-index: 2;" data-bind="if: !$parents[2].noHeaderRow()">
|
|
366
|
-
<tr class="no-highlight" data-bind="sortableColumns: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight',selectedFields: $parents[2].SelectedFields }">
|
|
367
|
-
<!-- ko if: $parentContext.$parentContext.$parent.canDrilldown() && !IsDrillDown() && !CanExpandOption() && (!$parents[2].hasPivotColumn() || ($parents[2].hasPivotColumn() && $parents[2].appSettings.useAltPivot)) -->
|
|
368
|
-
<th style="width: 30px; border-left: 1px solid;" data-bind="style: {'background-color': Columns[0].headerBackColor}"></th>
|
|
369
|
-
<!-- /ko -->
|
|
370
|
-
<!-- ko template: 'report-column-header', data: $data -->
|
|
371
|
-
<!-- /ko-->
|
|
372
|
-
</tr>
|
|
373
|
-
</thead>
|
|
374
|
-
<tbody data-bind="attr: {id: 'report-table-body' + $parents[2].ReportID()}">
|
|
375
|
-
<tr style="display: none;" data-bind="visible: Rows.length < 1">
|
|
376
|
-
<td data-bind="attr:{colspan: Columns.length + 1}">
|
|
377
|
-
No records found
|
|
378
|
-
</td>
|
|
379
|
-
</tr>
|
|
380
|
-
|
|
381
|
-
<!-- ko if: !$parents[2].useRenderTable() -->
|
|
382
|
-
<!-- ko foreach: $parent.rows -->
|
|
383
|
-
<tr>
|
|
384
|
-
<!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() && $parentContext.$parentContext.$parentContext.$parent.ReportType() != 'Single' -->
|
|
385
|
-
<td style="width: 30px; vertical-align: middle;" data-bind="style: {'background-color': Items[0]._backColor ?? Items[0].backColor(), 'color': Items[0]._fontColor ?? Items[0].fontColor()}">
|
|
386
|
-
<a href="#" data-bind="click: function(){ toggle(); }"><span class="fa" data-bind="css: {'fa-plus': !isExpanded(), 'fa-minus': isExpanded()}"></span></a>
|
|
387
|
-
</td>
|
|
388
|
-
<!-- /ko -->
|
|
389
|
-
<!-- ko template: 'report-column', data: $data -->
|
|
390
|
-
<!-- /ko-->
|
|
391
|
-
</tr>
|
|
392
|
-
<!-- ko if: isExpanded -->
|
|
393
|
-
<tr>
|
|
394
|
-
<td style="width: 30px;"></td>
|
|
395
|
-
<td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
|
|
396
|
-
<div data-bind="visible: !DrillDownData()">
|
|
397
|
-
<div class="report-spinner"></div>
|
|
398
|
-
</div>
|
|
399
|
-
<!-- ko if: DrillDownData -->
|
|
400
|
-
<table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData">
|
|
401
|
-
<thead>
|
|
402
|
-
<tr class="no-highlight">
|
|
403
|
-
<!-- ko template: 'report-column-header', data: $data -->
|
|
404
|
-
<!-- /ko-->
|
|
405
|
-
</tr>
|
|
406
|
-
</thead>
|
|
407
|
-
<tbody>
|
|
408
|
-
<tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
|
|
409
|
-
<td data-bind="attr: {colspan: Columns.length}">
|
|
410
|
-
No records found
|
|
411
|
-
</td>
|
|
412
|
-
</tr>
|
|
413
|
-
<!-- ko foreach: Rows -->
|
|
414
|
-
<tr>
|
|
415
|
-
<!-- ko template: 'report-column', data: $data -->
|
|
416
|
-
<!-- /ko-->
|
|
417
|
-
</tr>
|
|
418
|
-
<!-- /ko -->
|
|
419
|
-
</tbody>
|
|
420
|
-
</table>
|
|
421
|
-
<div class="col-xs-12 col-centered" data-bind="with: pager">
|
|
422
|
-
<div class="form-inline small text-muted">
|
|
423
|
-
<div class="pull-left total-records" data-bind="visible: pages()">
|
|
424
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span>
|
|
425
|
-
</div>
|
|
426
|
-
<div class="pull-left total-records">
|
|
427
|
-
|
|
428
|
-
<a href="#" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></a>
|
|
429
|
-
|
|
430
|
-
<a href="#" title="View Code" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
|
|
431
|
-
<span class="fa fa-code"></span>
|
|
432
|
-
</a>
|
|
433
|
-
</div>
|
|
434
|
-
<div class="form-group pull-right" data-bind="visible: pages()">
|
|
435
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
436
|
-
</div>
|
|
437
|
-
</div>
|
|
438
|
-
</div>
|
|
439
|
-
<!-- /ko -->
|
|
440
|
-
</td>
|
|
441
|
-
</tr>
|
|
442
|
-
<!-- /ko -->
|
|
443
|
-
<!-- ko if: subReportsRan().length > 0 -->
|
|
444
|
-
<tr>
|
|
445
|
-
<td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
|
|
446
|
-
<div data-bind="foreach: subReportsRan">
|
|
447
|
-
<div class="">
|
|
448
|
-
<div class="" style="padding-bottom: 20px;" >
|
|
449
|
-
<h2 class="pull-left" data-bind="text: ReportName"></h2>
|
|
450
|
-
|
|
451
|
-
<div class="clearfix"></div>
|
|
452
|
-
<div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
|
|
453
|
-
<p data-bind="html: ReportDescription, visible: ReportDescription"></p>
|
|
454
|
-
|
|
455
|
-
<div data-bind="with: ReportResult" class="small">
|
|
456
|
-
<div data-bind="visible: !ReportData()">
|
|
457
|
-
<div class="report-spinner"></div>
|
|
458
|
-
</div>
|
|
459
|
-
<div data-bind="template: 'report-template', data: $data"></div>
|
|
460
|
-
</div>
|
|
461
|
-
</div>
|
|
462
|
-
<div class="form-inline">
|
|
463
|
-
<div class="small" data-bind="with: pager">
|
|
464
|
-
<div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
|
|
465
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
|
|
466
|
-
</div>
|
|
467
|
-
<div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
|
|
468
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
469
|
-
</div>
|
|
470
|
-
</div>
|
|
471
|
-
</div>
|
|
472
|
-
</div>
|
|
473
|
-
|
|
474
|
-
</div>
|
|
475
|
-
</div>
|
|
476
|
-
</td>
|
|
477
|
-
</tr>
|
|
478
|
-
<!-- /ko -->
|
|
479
|
-
<!-- /ko -->
|
|
480
|
-
<!-- /ko-->
|
|
481
|
-
</tbody>
|
|
482
|
-
<!-- ko if: $parentContext.$parent.SubTotals().length == 1 && $parentContext.$parentContext.$parent.OuterGroupColumns().length == 0 -->
|
|
483
|
-
<tfoot data-bind="foreach: $parentContext.$parent.SubTotals">
|
|
484
|
-
<tr class="sub-total">
|
|
485
|
-
<!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() -->
|
|
486
|
-
<td></td>
|
|
487
|
-
<!-- /ko -->
|
|
488
|
-
<!-- ko foreach: Items -->
|
|
489
|
-
<!-- ko if: Value != 'NA' && Value != 'NaN' && !outerGroup() -->
|
|
490
|
-
<td data-bind="style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : 'right'}">
|
|
491
|
-
<div data-bind="style: {'width': fieldWidth }">
|
|
492
|
-
<span data-bind="html: formattedVal"></span>
|
|
493
|
-
</div>
|
|
494
|
-
</td>
|
|
495
|
-
<!-- /ko -->
|
|
496
|
-
<!-- /ko -->
|
|
497
|
-
</tr>
|
|
498
|
-
</tfoot>
|
|
499
|
-
<!-- /ko -->
|
|
500
|
-
</table>
|
|
501
|
-
</div>
|
|
502
|
-
</script>
|
|
503
|
-
|
|
504
|
-
<script type="text/html" id="report-render">
|
|
505
|
-
<div data-bind="with: ReportData">
|
|
506
|
-
<div data-bind="foreach: Rows">
|
|
507
|
-
<div data-bind="html: renderedHtml, css: { 'card-view': $parents[$parents.length-1].cardView }"></div>
|
|
508
|
-
|
|
509
|
-
<div data-bind="foreach: subReportsRan">
|
|
510
|
-
<div class="">
|
|
511
|
-
<div class="" style="padding-bottom: 20px;" >
|
|
512
|
-
<h2 class="pull-left" data-bind="text: ReportName"></h2>
|
|
513
|
-
|
|
514
|
-
<div class="clearfix"></div>
|
|
515
|
-
<div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
|
|
516
|
-
<p data-bind="html: ReportDescription, visible: ReportDescription"></p>
|
|
517
|
-
|
|
518
|
-
<div data-bind="with: ReportResult" class="small">
|
|
519
|
-
<div data-bind="visible: !ReportData()">
|
|
520
|
-
<div class="report-spinner"></div>
|
|
521
|
-
</div>
|
|
522
|
-
<div data-bind="template: 'report-template', data: $data"></div>
|
|
523
|
-
</div>
|
|
524
|
-
</div>
|
|
525
|
-
<div class="form-inline">
|
|
526
|
-
<div class="small" data-bind="with: pager">
|
|
527
|
-
<div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
|
|
528
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
|
|
529
|
-
</div>
|
|
530
|
-
<div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
|
|
531
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
532
|
-
</div>
|
|
533
|
-
</div>
|
|
534
|
-
</div>
|
|
535
|
-
</div>
|
|
536
|
-
|
|
537
|
-
</div>
|
|
538
|
-
</div>
|
|
539
|
-
</div>
|
|
540
|
-
</div>
|
|
541
|
-
<div class="clearfix"></div>
|
|
542
|
-
</script>
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
<script type="text/html" id="report-template">
|
|
546
|
-
<div class="report-chart" data-bind="attr: {id: 'chart_div_' + $parent.ReportID()}, visible: $parent.isChart"></div>
|
|
547
|
-
<!-- ko if: $parent.ReportType() == 'Pivot' -->
|
|
548
|
-
<div data-bind="template: {name: 'report-pivot', data: $data }"></div>
|
|
549
|
-
<!-- /ko -->
|
|
550
|
-
|
|
551
|
-
<!-- ko if: $parent.ReportType() == 'Html' -->
|
|
552
|
-
<div data-bind="template: {name: 'report-render', data: $data }"></div>
|
|
553
|
-
<!-- /ko -->
|
|
554
|
-
|
|
555
|
-
<!-- ko if: $parent.ReportType() != 'Pivot' && $parent.ReportType() != 'Html' && (!$parent.isChart() || $parent.ShowDataWithGraph()) -->
|
|
556
|
-
<div class="pull-right" data-bind="if: $parent.OuterGroupColumns().length > 0">
|
|
557
|
-
<a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
|
|
558
|
-
Manage Groups <span class="fa fa-ellipsis-v"></span>
|
|
559
|
-
</a>
|
|
560
|
-
<ul class="dropdown-menu" style="z-index: 1001;" data-bind="foreach: $parent.OuterGroupColumns">
|
|
561
|
-
<li class="dropdown-item small">
|
|
562
|
-
<a href="#" data-bind="click: remove" title="Remove from Group">
|
|
563
|
-
<span class="fa fa-close"></span> <span data-bind="text: fieldName"></span>
|
|
564
|
-
</a>
|
|
565
|
-
</li>
|
|
566
|
-
</ul>
|
|
567
|
-
</div>
|
|
568
|
-
<div class="clear-fix"></div>
|
|
569
|
-
|
|
570
|
-
<div data-bind="foreach: outerGroupData">
|
|
571
|
-
<!-- ko if: rows.length > 0 || ($parent.outerGroupData && $parent.outerGroupData().length == 1) -->
|
|
572
|
-
<h6 data-bind="html: display"></h6>
|
|
573
|
-
<div class="" style="padding-top: 5px;"></div>
|
|
574
|
-
|
|
575
|
-
<!-- ko if: $parents[1].ReportType() != 'Single'-->
|
|
576
|
-
<div data-bind="template: {name: 'report-table', data: $parent.ReportData }"></div>
|
|
577
|
-
<!-- /ko -->
|
|
578
|
-
<!-- ko if: $parents[1].ReportType() == 'Single'-->
|
|
579
|
-
<div data-bind="template: {name: 'report-widget', data: $parent.ReportData }"></div>
|
|
580
|
-
<!-- /ko -->
|
|
581
|
-
<!-- /ko -->
|
|
582
|
-
</div>
|
|
583
|
-
<!-- /ko -->
|
|
584
|
-
</script>
|
|
585
|
-
<script type="text/html" id="admin-mode-template">
|
|
586
|
-
<div class="row">
|
|
587
|
-
<div class="d-flex justify-content-end align-items-center" style="gap: 10px;">
|
|
588
|
-
<div data-bind="visible: adminMode">
|
|
589
|
-
<div class="alert alert-info d-inline-block" style="font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;">
|
|
590
|
-
<i class="fa fa-user-circle"></i> You can manage Reports/Dashboards for all users
|
|
591
|
-
</div>
|
|
592
|
-
</div>
|
|
593
|
-
<div class="d-flex align-items-center">
|
|
594
|
-
<div class="bubble-badge">
|
|
595
|
-
Admin Mode
|
|
596
|
-
<div class="form-check form-switch ms-2">
|
|
597
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: adminMode">
|
|
598
|
-
</div>
|
|
599
|
-
</div>
|
|
600
|
-
</div>
|
|
601
|
-
</div>
|
|
602
|
-
</div>
|
|
603
|
-
</script>
|
|
604
|
-
<script type="text/html" id="manage-access-template">
|
|
605
|
-
<h5><span class="fa fa-key"></span>Manage Access</h5>
|
|
606
|
-
<div class="panel panel-default panel-body" style="margin-left: 20px;">
|
|
607
|
-
|
|
608
|
-
<div class="form-group row">
|
|
609
|
-
<label class="col-md-3 col-sm-3 control-label">Client Id to Restrict Access</label>
|
|
610
|
-
<div class="col-md-3 col-sm-3">
|
|
611
|
-
<input class="form-control text-box single-line" type="text" data-bind="value: clientId">
|
|
612
|
-
</div>
|
|
613
|
-
<div class="col-md-1 col-sm-1">
|
|
614
|
-
<span data-bs-toggle="tooltip" data-placement="right" class="fa fa-question-circle helptip" title="Leave blank to give all clients access (Global Reports)"></span>
|
|
615
|
-
</div>
|
|
616
|
-
</div>
|
|
617
|
-
<div class="alert alert-info">
|
|
618
|
-
<span class="fa fa-lightbulb-o fa-2x"></span> User level rights override Role level rights. No selection for a rule implies report is available to all.
|
|
619
|
-
</div>
|
|
620
|
-
|
|
621
|
-
<div class="row small">
|
|
622
|
-
<div class="col-md-6">
|
|
623
|
-
<i class="toggle-icon fa" data-bind="click: toggleManageUsers,css: { 'fa-chevron-down': showManageUsers(), 'fa-chevron-right': !showManageUsers() }"></i> <b>Manage by User</b> (allow edit)
|
|
624
|
-
<div class="row container-fluid" data-bind="visible: showManageUsers">
|
|
625
|
-
<!-- ko if: groupedUsers().length > 0 -->
|
|
626
|
-
<!-- ko foreach: groupedUsers -->
|
|
627
|
-
<div class="col-md-12">
|
|
628
|
-
<div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
|
|
629
|
-
<i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
|
|
630
|
-
<strong data-bind="text: category"></strong>
|
|
631
|
-
</div>
|
|
632
|
-
<div class="row container-fluid" data-bind="visible: show">
|
|
633
|
-
<!-- ko foreach: users -->
|
|
634
|
-
<div class="pull-left">
|
|
635
|
-
<div class="checkbox">
|
|
636
|
-
<label class="label label-info">
|
|
637
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span> </label>
|
|
638
|
-
</div>
|
|
639
|
-
</div>
|
|
640
|
-
<!-- /ko -->
|
|
641
|
-
</div>
|
|
642
|
-
</div>
|
|
643
|
-
<!-- /ko -->
|
|
644
|
-
<!-- /ko -->
|
|
645
|
-
<!-- ko if: groupedUsers().length == 0 && users.length > 0 -->
|
|
646
|
-
<!-- ko foreach: users -->
|
|
647
|
-
<div class="pull-left">
|
|
648
|
-
<div class="checkbox">
|
|
649
|
-
<label class="label label-info">
|
|
650
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
651
|
-
</label>
|
|
652
|
-
</div>
|
|
653
|
-
</div>
|
|
654
|
-
<!-- /ko -->
|
|
655
|
-
<!-- /ko -->
|
|
656
|
-
<div data-bind="if: groupedUsers().length == 0 && users.length == 0">
|
|
657
|
-
Users list not populated or not applicable
|
|
658
|
-
</div>
|
|
659
|
-
</div>
|
|
660
|
-
<br />
|
|
661
|
-
<i class="toggle-icon fa" data-bind="click: toggleViewUsers,css: { 'fa-chevron-down': showViewUsers(), 'fa-chevron-right': !showViewUsers() }"></i> <b>View only by User</b> (no edit/delete)
|
|
662
|
-
<div class="row container-fluid" data-bind="visible: showViewUsers">
|
|
663
|
-
<!-- ko if: groupedViewOnlyUsers().length > 0 -->
|
|
664
|
-
<!-- ko foreach: groupedViewOnlyUsers -->
|
|
665
|
-
<div class="col-md-12">
|
|
666
|
-
<div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
|
|
667
|
-
<i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
|
|
668
|
-
<strong data-bind="text: category"></strong>
|
|
669
|
-
</div>
|
|
670
|
-
<div class="row container-fluid" data-bind="visible: show">
|
|
671
|
-
<!-- ko foreach: viewOnlyUsers -->
|
|
672
|
-
<div class="pull-left">
|
|
673
|
-
<div class="checkbox">
|
|
674
|
-
<label class="label label-info">
|
|
675
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span> </label>
|
|
676
|
-
</div>
|
|
677
|
-
</div>
|
|
678
|
-
<!-- /ko -->
|
|
679
|
-
</div>
|
|
680
|
-
</div>
|
|
681
|
-
<!-- /ko -->
|
|
682
|
-
<!-- /ko -->
|
|
683
|
-
<!-- ko if: groupedViewOnlyUsers().length == 0 && viewOnlyUsers.length > 0 -->
|
|
684
|
-
<!-- ko foreach: viewOnlyUsers -->
|
|
685
|
-
<div class="pull-left">
|
|
686
|
-
<div class="checkbox">
|
|
687
|
-
<label class="label label-info">
|
|
688
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
689
|
-
</label>
|
|
690
|
-
</div>
|
|
691
|
-
</div>
|
|
692
|
-
<!-- /ko -->
|
|
693
|
-
<!-- /ko -->
|
|
694
|
-
<div data-bind="if: groupedViewOnlyUsers().length == 0 && users.length == 0">
|
|
695
|
-
Users list not populated or not applicable
|
|
696
|
-
</div>
|
|
697
|
-
</div>
|
|
698
|
-
<br />
|
|
699
|
-
<div data-bind="ifnot: isDashboard">
|
|
700
|
-
<i class="toggle-icon fa" data-bind="click: toggleDeleteUsers,css: { 'fa-chevron-down': showDeleteUsers(), 'fa-chevron-right': !showDeleteUsers() }"></i><b>Delete by User</b> (allow delete)
|
|
701
|
-
<div class="row container-fluid" data-bind="visible: showDeleteUsers">
|
|
702
|
-
<!-- ko if: groupedDeleteOnlyUsers().length > 0 -->
|
|
703
|
-
<!-- ko foreach: groupedDeleteOnlyUsers -->
|
|
704
|
-
<div class="col-md-12">
|
|
705
|
-
<div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
|
|
706
|
-
<i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
|
|
707
|
-
<strong data-bind="text: category"></strong>
|
|
708
|
-
</div>
|
|
709
|
-
<div class="row container-fluid" data-bind="visible: show">
|
|
710
|
-
<!-- ko foreach: deleteOnlyUsers -->
|
|
711
|
-
<div class="pull-left">
|
|
712
|
-
<div class="checkbox">
|
|
713
|
-
<label class="label label-info">
|
|
714
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span> </label>
|
|
715
|
-
</div>
|
|
716
|
-
</div>
|
|
717
|
-
<!-- /ko -->
|
|
718
|
-
</div>
|
|
719
|
-
</div>
|
|
720
|
-
<!-- /ko -->
|
|
721
|
-
<!-- /ko -->
|
|
722
|
-
<!-- ko if: groupedDeleteOnlyUsers().length == 0 && deleteOnlyUsers.length > 0 -->
|
|
723
|
-
<!-- ko foreach: deleteOnlyUsers -->
|
|
724
|
-
<div class="pull-left">
|
|
725
|
-
<div class="checkbox">
|
|
726
|
-
<label class="label label-info">
|
|
727
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
728
|
-
</label>
|
|
729
|
-
</div>
|
|
730
|
-
</div>
|
|
731
|
-
<!-- /ko -->
|
|
732
|
-
<!-- /ko -->
|
|
733
|
-
<div data-bind="if: groupedDeleteOnlyUsers().length == 0 && users.length == 0">
|
|
734
|
-
Users list not populated or not applicable
|
|
735
|
-
</div>
|
|
736
|
-
</div>
|
|
737
|
-
<br />
|
|
738
|
-
</div>
|
|
739
|
-
</div>
|
|
740
|
-
<div class="col-md-6">
|
|
741
|
-
<i class="toggle-icon fa" data-bind="click: toggleManageRoles,css: { 'fa-chevron-down': showManageRoles(), 'fa-chevron-right': !showManageRoles() }"></i><b>Manage by User Role</b> (allow edit)
|
|
742
|
-
<div class="row container-fluid" data-bind="visible: showManageRoles">
|
|
743
|
-
<!-- ko foreach: userRoles -->
|
|
744
|
-
<div class="pull-left">
|
|
745
|
-
<div class="checkbox">
|
|
746
|
-
<label class="label label-info">
|
|
747
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
748
|
-
</label>
|
|
749
|
-
</div>
|
|
750
|
-
</div>
|
|
751
|
-
<!-- /ko -->
|
|
752
|
-
<div data-bind="if: userRoles.length == 0">
|
|
753
|
-
User Roles list not populated or not applicable
|
|
754
|
-
</div>
|
|
755
|
-
</div>
|
|
756
|
-
<br />
|
|
757
|
-
<i class="toggle-icon fa" data-bind="click: toggleViewRoles,css: { 'fa-chevron-down': showViewRoles(), 'fa-chevron-right': !showViewRoles() }"></i><b>View only by User Role</b> (no edit/delete)
|
|
758
|
-
<div class="row container-fluid" data-bind="visible: showViewRoles">
|
|
759
|
-
<!-- ko foreach: viewOnlyUserRoles -->
|
|
760
|
-
<div class="pull-left">
|
|
761
|
-
<div class="checkbox">
|
|
762
|
-
<label class="label label-info">
|
|
763
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
764
|
-
</label>
|
|
765
|
-
</div>
|
|
766
|
-
</div>
|
|
767
|
-
<!-- /ko -->
|
|
768
|
-
<div data-bind="if: userRoles.length == 0">
|
|
769
|
-
User Roles list not populated or not applicable
|
|
770
|
-
</div>
|
|
771
|
-
</div>
|
|
772
|
-
<div data-bind="ifnot: isDashboard">
|
|
773
|
-
<i class="toggle-icon fa" data-bind="click: toggleDeleteRoles,css: { 'fa-chevron-down': showDeleteRoles(), 'fa-chevron-right': !showDeleteRoles() }"></i><b>Delete by User Role</b> (allow delete)
|
|
774
|
-
<div class="row container-fluid" data-bind="visible: showDeleteRoles">
|
|
775
|
-
<!-- ko foreach: deleteOnlyUserRoles -->
|
|
776
|
-
<div class="pull-left">
|
|
777
|
-
<div class="checkbox">
|
|
778
|
-
<label class="label label-info">
|
|
779
|
-
<input type="checkbox" data-bind="checked: selected"> <span data-bind="text: text"></span>
|
|
780
|
-
</label>
|
|
781
|
-
</div>
|
|
782
|
-
</div>
|
|
783
|
-
<!-- /ko -->
|
|
784
|
-
<div data-bind="if: userRoles.length == 0">
|
|
785
|
-
User Roles list not populated or not applicable
|
|
786
|
-
</div>
|
|
787
|
-
</div>
|
|
788
|
-
</div>
|
|
789
|
-
</div>
|
|
790
|
-
</div>
|
|
791
|
-
</div>
|
|
792
|
-
</script>
|
|
793
|
-
<script type="text/html" id="filter-group">
|
|
794
|
-
<div class="query-builder form-inline" data-bind="foreach: FilterGroups">
|
|
795
|
-
<div class="rules-group-container">
|
|
796
|
-
<div class="rules-group-header" data-bind="attr: {parentdivid: generateUniqueId()}">
|
|
797
|
-
<div data-bind="visible: !isRoot">
|
|
798
|
-
<div class="pull-left">
|
|
799
|
-
<div class="btn-group btn-group-toggle btn-group-sm" data-bs-toggle="buttons" role="group">
|
|
800
|
-
<label class="btn btn-light active" style="margin-right: 0px;">
|
|
801
|
-
<input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="And" /> And
|
|
802
|
-
</label>
|
|
803
|
-
<label class="btn btn-light active">
|
|
804
|
-
<input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="Or" /> Or
|
|
805
|
-
</label>
|
|
806
|
-
</div>
|
|
807
|
-
</div>
|
|
808
|
-
<div class="pull-right">
|
|
809
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilterGroup, visible: !isRoot">Remove Group</button>
|
|
810
|
-
</div>
|
|
811
|
-
</div>
|
|
812
|
-
<div data-bind="visible: isRoot">
|
|
813
|
-
<div class="pull-left padded-div">
|
|
814
|
-
<label> Filter Conditions</label>
|
|
815
|
-
</div>
|
|
816
|
-
</div>
|
|
817
|
-
<div class="clearfix"></div>
|
|
818
|
-
</div>
|
|
819
|
-
|
|
820
|
-
<div class="rules-group-body" data-bind="template: {name: 'filter-inner'}"></div>
|
|
821
|
-
</div>
|
|
822
|
-
</div>
|
|
823
|
-
</script>
|
|
824
|
-
<script type="text/html" id="fly-filter-template">
|
|
825
|
-
<div class="card" data-bind="visible: FlyFilters().length>0 || DontExecuteOnRun">
|
|
826
|
-
<div class="card-header">
|
|
827
|
-
<a data-bs-toggle="collapse" data-bind="attr: {'data-bs-target': '#filter-panel-' + ReportID() }" href="#">
|
|
828
|
-
<i class="fa fa-filter"></i> Choose Filters
|
|
829
|
-
</a>
|
|
830
|
-
</div>
|
|
831
|
-
<div data-bind="attr: {id: 'filter-panel-' + ReportID() }, css: {collpased: !DontExecuteOnRun(), collapse: !DontExecuteOnRun()}" class="card-body">
|
|
832
|
-
<div>
|
|
833
|
-
<!-- ko foreach: FlyFilters -->
|
|
834
|
-
<div class="row">
|
|
835
|
-
<div class="col-sm-5 col-xs-4">
|
|
836
|
-
<div data-bind="with: Field" class="checkbox">
|
|
837
|
-
<div class="checkbox">
|
|
838
|
-
<label>
|
|
839
|
-
<input type="checkbox" title="Apply this filter" data-bind="checked: $parent.Apply, disabled: forced" /> <span data-bind="text: selectedFilterName"></span>
|
|
840
|
-
</label>
|
|
841
|
-
</div>
|
|
842
|
-
</div>
|
|
843
|
-
</div>
|
|
844
|
-
<div data-bind="with: Field" class="col-sm-2 col-xs-3">
|
|
845
|
-
<div class="form-group" data-bind="if: $parent.Apply">
|
|
846
|
-
<select class="form-select" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
|
|
847
|
-
</div>
|
|
848
|
-
</div>
|
|
849
|
-
<div data-bind="with: Field" class="col-sm-5 col-xs-5">
|
|
850
|
-
<div data-bind="if: $parent.Apply" data-parentprefix="F" >
|
|
851
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
852
|
-
</div>
|
|
853
|
-
</div>
|
|
854
|
-
</div>
|
|
855
|
-
<!-- /ko -->
|
|
856
|
-
<button class="btn btn-primary" data-bind="click: ExecuteReport">Run</button>
|
|
857
|
-
</div>
|
|
858
|
-
</div>
|
|
859
|
-
</div>
|
|
860
|
-
</script>
|
|
861
|
-
|
|
862
|
-
<script type="text/html" id="filter-inner">
|
|
863
|
-
<div class="rules-list">
|
|
864
|
-
<div class="rule-container" data-bind="visible: Filters().length>0">
|
|
865
|
-
<table class="table table-striped table-hover table-borderless">
|
|
866
|
-
<thead>
|
|
867
|
-
<tr>
|
|
868
|
-
<th class="row">
|
|
869
|
-
<div class="col-md-1"></div>
|
|
870
|
-
<div class="col-md-4">Field</div>
|
|
871
|
-
<div class="col-md-2"></div>
|
|
872
|
-
<div class="col-md-4">Filter</div>
|
|
873
|
-
<div class="col-md-1"></div>
|
|
874
|
-
</th>
|
|
875
|
-
</tr>
|
|
876
|
-
</thead>
|
|
877
|
-
<tbody data-bind="foreach: Filters">
|
|
878
|
-
<tr class="rule-container">
|
|
879
|
-
<td class="row">
|
|
880
|
-
<div class="col-md-1">
|
|
881
|
-
<select data-bind="value: AndOr, visible: $index()>0" class="form-select">
|
|
882
|
-
<option>And</option>
|
|
883
|
-
<option>Or</option>
|
|
884
|
-
</select>
|
|
885
|
-
</div>
|
|
886
|
-
<div class="col-md-3">
|
|
887
|
-
<div class="form-group">
|
|
888
|
-
<select class="form-select" style="width: 100%;" data-bind="
|
|
889
|
-
options: $parents[$parents.length-2].selectedFieldsCanFilter != undefined
|
|
890
|
-
? $parents[$parents.length-2].selectedFieldsCanFilter
|
|
891
|
-
: $parents[$parents.length-1].selectedFieldsCanFilter,
|
|
892
|
-
optionsText: 'selectedFieldName',
|
|
893
|
-
optionsCaption: 'Please Choose',
|
|
894
|
-
value: Field,
|
|
895
|
-
attr: {required: Field()==null?'required':false},
|
|
896
|
-
disable: Field() && Field().forced"></select>
|
|
897
|
-
</div>
|
|
898
|
-
</div>
|
|
899
|
-
<div class="col-md-2">
|
|
900
|
-
<div data-bind="with: Field">
|
|
901
|
-
<div class="form-group">
|
|
902
|
-
<select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
|
|
903
|
-
</div>
|
|
904
|
-
</div>
|
|
905
|
-
</div>
|
|
906
|
-
<div class="col-md-5">
|
|
907
|
-
<div data-bind="with: Field" data-parentprefix="M">
|
|
908
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
909
|
-
</div>
|
|
910
|
-
<!-- ko if: Field() && Field().fieldType == 'DateTime' && Operator() == 'range' && $index()==0 -->
|
|
911
|
-
<!-- ko if: $parents[$parents.length-2].canAddSeries != undefined && $parents[$parents.length-2].canAddSeries() -->
|
|
912
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parents[$parents.length-2].AddSeries.bind($data)">Add Comparison</button>
|
|
913
|
-
<!--/ko -->
|
|
914
|
-
<!-- ko if: $parents[$parents.length-2].canAddSeries == undefined && $parentContext.$parent.canAddSeries != undefined && $parentContext.$parent.canAddSeries()-->
|
|
915
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parentContext.$parent.AddSeries.bind($data)">Add Comparison</button>
|
|
916
|
-
<!--/ko -->
|
|
917
|
-
<!--/ko -->
|
|
918
|
-
<span data-bind="visible: Field() && Field().forced" class="badge bg-info">Required Filter</span>
|
|
919
|
-
</div>
|
|
920
|
-
<div class="col-md-1">
|
|
921
|
-
<div style="display: flex; align-items: center;">
|
|
922
|
-
<div class="form-group" style="flex-grow: 1;">
|
|
923
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilter, hidden: Field() && Field().forced" title="Remove">
|
|
924
|
-
<i class="fa fa-trash"></i>
|
|
925
|
-
</button>
|
|
926
|
-
</div>
|
|
927
|
-
<div class="form-group" style="flex-grow: 1;" data-bind="with: Field, hidden: document.querySelector('#filter-panel.card-body.collapse')">
|
|
928
|
-
<span class="btn btn-sm" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {'btn-success': filterOnFly()==true, 'btn-secondary': filterOnFly()==false}">
|
|
929
|
-
<span class="fa fa-filter" aria-hidden="true" title="Filter on Report"></span>
|
|
930
|
-
</span>
|
|
931
|
-
</div>
|
|
932
|
-
</div>
|
|
933
|
-
|
|
934
|
-
</div>
|
|
935
|
-
</td>
|
|
936
|
-
</tr>
|
|
937
|
-
<!-- ko foreach: compareTo -->
|
|
938
|
-
<tr>
|
|
939
|
-
<td class="row">
|
|
940
|
-
<div class="col-md-6"> </div>
|
|
941
|
-
<div class="col-md-2">
|
|
942
|
-
<span style="text-align: right"><button class="btn btn-sm" data-bind="click: $parents[2].RemoveSeries"><span class="fa fa-trash-o"></span></button></span>
|
|
943
|
-
<span class="muted">Compare to</span>
|
|
944
|
-
</div>
|
|
945
|
-
<div class="col-md-4">
|
|
946
|
-
<select class="form-select" data-bind="options: Range, value: Value" required></select>
|
|
947
|
-
</div>
|
|
948
|
-
</td>
|
|
949
|
-
</tr>
|
|
950
|
-
<!-- /ko -->
|
|
951
|
-
</tbody>
|
|
952
|
-
</table>
|
|
953
|
-
</div>
|
|
954
|
-
|
|
955
|
-
<div class="rule-container">
|
|
956
|
-
<div data-bind="template: {name: 'filter-group'}"></div>
|
|
957
|
-
<div>
|
|
958
|
-
<button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilter">Add Filter</button>
|
|
959
|
-
<button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilterGroup">Add Filter Group</button>
|
|
960
|
-
</div>
|
|
961
|
-
</div>
|
|
962
|
-
</div>
|
|
963
|
-
|
|
964
|
-
</script>
|
|
965
|
-
|
|
966
|
-
<script type="text/html" id="filter-parameters">
|
|
967
|
-
<div class="table-responsive">
|
|
968
|
-
<span data-bind="hidden: showParameters">No filters available to choose</span>
|
|
969
|
-
<table class="table table-striped table-hover table-borderless" data-bind="visible: showParameters">
|
|
970
|
-
<thead>
|
|
971
|
-
<tr>
|
|
972
|
-
<th style="width: 30%">Filter</th>
|
|
973
|
-
<th style="width: 20%"></th>
|
|
974
|
-
<th style="width: 30%">Value</th>
|
|
975
|
-
<th></th>
|
|
976
|
-
</tr>
|
|
977
|
-
</thead>
|
|
978
|
-
<tbody data-bind="foreach: Parameters">
|
|
979
|
-
<tr data-bind="ifnot: Hidden">
|
|
980
|
-
<td data-bind="text: DisplayName">
|
|
981
|
-
</td>
|
|
982
|
-
<td>
|
|
983
|
-
<div class="form-group">
|
|
984
|
-
<select class="form-select" style="width: 100%;" data-bind="options: operators, value: Operator" required></select>
|
|
985
|
-
</div>
|
|
986
|
-
</td>
|
|
987
|
-
<td data-bind="with: Field" data-parentprefix="P">
|
|
988
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
989
|
-
</td>
|
|
990
|
-
<td></td>
|
|
991
|
-
</tr>
|
|
992
|
-
|
|
993
|
-
</tbody>
|
|
994
|
-
</table>
|
|
995
|
-
</div>
|
|
996
|
-
</script>
|
|
997
|
-
|
|
998
|
-
<script type="text/html" id="report-schedule">
|
|
999
|
-
<div data-bind="with: scheduleBuilder" id="schedule-builder-div">
|
|
1000
|
-
<div class="form-check">
|
|
1001
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: hasSchedule" id="scheduleReportCheckbox">
|
|
1002
|
-
<label class="form-check-label" for="scheduleReportCheckbox">
|
|
1003
|
-
Set Schedule to send by Email
|
|
1004
|
-
</label>
|
|
1005
|
-
</div>
|
|
1006
|
-
<div data-bind="if: hasSchedule">
|
|
1007
|
-
<div class="d-flex align-items-center">
|
|
1008
|
-
<div class="me-3 d-flex align-items-center">
|
|
1009
|
-
<span data-bind="text: selectedOption() != 'once' ? 'Every ' : ''"></span>
|
|
1010
|
-
<select class="form-select" required data-bind="options: options, value: selectedOption" style="min-width: 80px;"></select>
|
|
1011
|
-
</div>
|
|
1012
|
-
<div data-bind="if: selectedOption() == 'once'" class="me-3 d-flex align-items-center">
|
|
1013
|
-
on <input data-bind="datepicker: selectedDate, datepickerOptions: {value: selectedDate}" class="form-control" required />
|
|
1014
|
-
</div>
|
|
1015
|
-
<div class="d-flex align-items-center">
|
|
1016
|
-
<div data-bind="if: showDays" class="d-flex align-items-center">
|
|
1017
|
-
on
|
|
1018
|
-
<select multiple class="form-select ms-2" required data-bind="select2: { placeholder: 'Choose Days', allowClear: true }, options: days, selectedOptions: selectedDays"></select>
|
|
1019
|
-
</div>
|
|
1020
|
-
<div data-bind="if: showDates" class="d-flex align-items-center">
|
|
1021
|
-
on
|
|
1022
|
-
<select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Dates', allowClear: true }, options: dates, selectedOptions: selectedDates"></select>
|
|
1023
|
-
</div>
|
|
1024
|
-
<div data-bind="if: showMonths" class="d-flex align-items-center">
|
|
1025
|
-
on
|
|
1026
|
-
<select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Months', allowClear: true }, options: months, selectedOptions: selectedMonths"></select>
|
|
1027
|
-
</div>
|
|
1028
|
-
<div data-bind="if: showAtTime" class="d-flex align-items-center ms-3">
|
|
1029
|
-
at
|
|
1030
|
-
<select class="form-select me-2" style="min-width: 60px;" data-bind="options: hours, value: selectedHour"></select>
|
|
1031
|
-
<select class="form-select me-2" style="min-width: 60px;" data-bind="options: minutes, value: selectedMinute"></select>
|
|
1032
|
-
<select class="form-select" style="min-width: 80px;" data-bind="value: selectedAmPm">
|
|
1033
|
-
<option>AM</option>
|
|
1034
|
-
<option>PM</option>
|
|
1035
|
-
</select>
|
|
1036
|
-
</div>
|
|
1037
|
-
</div>
|
|
1038
|
-
</div>
|
|
1039
|
-
|
|
1040
|
-
<div class="alert alert-info">
|
|
1041
|
-
Report will be run and emailed <span data-bind="text: selectedOption() != 'once' ? 'every' : ''"></span> <span data-bind="text: selectedOption"></span>
|
|
1042
|
-
<span data-bind="if: selectedOption() == 'once'">
|
|
1043
|
-
on <span class="error" data-bind="visible: !selectedDate()">Please pick a Date</span> <span data-bind="text: selectedDate"></span>
|
|
1044
|
-
</span>
|
|
1045
|
-
<span data-bind="if: showDays">
|
|
1046
|
-
on <span class="error" data-bind="visible: selectedDays().length == 0">Please pick Day(s)</span> <span data-bind="text: selectedDays"></span>
|
|
1047
|
-
</span>
|
|
1048
|
-
<span data-bind="if: showDates">
|
|
1049
|
-
on <span class="error" data-bind="visible: selectedDates().length == 0">Please pick Date(s)</span>
|
|
1050
|
-
<span data-bind="foreach: selectedDates"><span data-bind="visible: $index()>0">, </span><span data-bind="text: $data == 1 ? '1st': ($data == 2 ? '2nd' : ($data == 3 ? '3rd' : ($data == 31 ? '31st' : $data+'th')))"></span></span>
|
|
1051
|
-
</span>
|
|
1052
|
-
<span data-bind="if: showMonths">
|
|
1053
|
-
of <span class="error" data-bind="visible: selectedMonths().length == 0">Please pick Month(s)</span> <span data-bind="text: selectedMonths"></span>
|
|
1054
|
-
</span>
|
|
1055
|
-
<span data-bind="if: showAtTime">
|
|
1056
|
-
at <span data-bind="text: selectedHour"></span>:<span data-bind="text: selectedMinute"></span> <span data-bind="text: selectedAmPm"></span>
|
|
1057
|
-
</span>
|
|
1058
|
-
</div>
|
|
1059
|
-
<div class="mb-3">
|
|
1060
|
-
<div class="row g-3">
|
|
1061
|
-
<label class="col-sm-3 col-form-label">Email to</label>
|
|
1062
|
-
<div class="col-sm-6">
|
|
1063
|
-
<input type="text" class="form-control" data-bind="value: emailTo" placeholder="Enter Email Addresses separated by comma to send the Report to" required />
|
|
1064
|
-
</div>
|
|
1065
|
-
<label class="col-sm-1 col-form-label">Format</label>
|
|
1066
|
-
<div class="col-sm-2">
|
|
1067
|
-
<select class="form-select" data-bind="value: format,event: { change: onFormatChange }">
|
|
1068
|
-
<option value="EXCEL">Excel</option>
|
|
1069
|
-
<option data-bind="visible: $parent.canDrilldown && $parent.canDrilldown()" value="EXCEL-SUB">Excel (Expanded)</option>
|
|
1070
|
-
<option value="CSV">CSV</option>
|
|
1071
|
-
<option value="PDF">PDF</option>
|
|
1072
|
-
<option value="WORD">Word</option>
|
|
1073
|
-
<option value="LINK">Link</option>
|
|
1074
|
-
</select>
|
|
1075
|
-
</div>
|
|
1076
|
-
</div>
|
|
1077
|
-
</div>
|
|
1078
|
-
<div class="mb-3">
|
|
1079
|
-
<div class="row g-3">
|
|
1080
|
-
<label class="col-sm-3 col-form-label">Pick Time Zone</label>
|
|
1081
|
-
<div class="col-sm-9">
|
|
1082
|
-
<select class="form-select" data-bind="options: timezonOption,
|
|
1083
|
-
optionsText: 'displayName',
|
|
1084
|
-
optionsValue: 'timeZoneId',
|
|
1085
|
-
value: selectedTimezone,
|
|
1086
|
-
select2: {dropdownParent: $('#schedule-builder-div'), allowClear: true, placeholder: 'Set a time zone to send report'}">
|
|
1087
|
-
</select>
|
|
1088
|
-
</div>
|
|
1089
|
-
</div>
|
|
1090
|
-
</div>
|
|
1091
|
-
<div class="mb-3">
|
|
1092
|
-
<div class="row g-3">
|
|
1093
|
-
<div class="col-sm-3">
|
|
1094
|
-
<div class="form-check" title="Set a date to start sending scheduled report">
|
|
1095
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleStart" id="scheduleStartCheckbox">
|
|
1096
|
-
<label class="form-check-label" for="scheduleStartCheckbox">
|
|
1097
|
-
Schedule Start Date
|
|
1098
|
-
</label>
|
|
1099
|
-
</div>
|
|
1100
|
-
</div>
|
|
1101
|
-
<div class="col-sm-4" data-bind="if: hasScheduleStart">
|
|
1102
|
-
<input type="text" class="form-control" data-bind="datepicker: scheduleStart, datepickerOptions: {value: scheduleStart}" title="Scheduled Report will not be sent before this date" required />
|
|
1103
|
-
</div>
|
|
1104
|
-
</div>
|
|
1105
|
-
</div>
|
|
1106
|
-
<div class="mb-3">
|
|
1107
|
-
<div class="row g-3">
|
|
1108
|
-
<div class="col-sm-3">
|
|
1109
|
-
<div class="form-check" title="Set a date to stop sending scheduled report">
|
|
1110
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleEnd" id="scheduleEndCheckbox">
|
|
1111
|
-
<label class="form-check-label" for="scheduleEndCheckbox">
|
|
1112
|
-
Schedule End Date
|
|
1113
|
-
</label>
|
|
1114
|
-
</div>
|
|
1115
|
-
</div>
|
|
1116
|
-
<div class="col-sm-4" data-bind="if: hasScheduleEnd">
|
|
1117
|
-
<input type="text" class="form-control" data-bind="datepicker: scheduleEnd, datepickerOptions: {value: scheduleEnd}" title="Scheduled Report will not be sent after this date" required />
|
|
1118
|
-
</div>
|
|
1119
|
-
</div>
|
|
1120
|
-
</div>
|
|
1121
|
-
</div>
|
|
1122
|
-
</div>
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
</script>
|
|
1126
|
-
|
|
1127
|
-
<script type="text/html" id="report-field-options">
|
|
1128
|
-
<div class="modal-dialog" style="max-width: 750px;">
|
|
1129
|
-
<div class="modal-content" data-bind="with: editFieldOptions">
|
|
1130
|
-
<div class="modal-header">
|
|
1131
|
-
<h5 class="modal-title"><span data-bind="text: fieldName"></span> - Setup Additional Field Options</h5>
|
|
1132
|
-
</div>
|
|
1133
|
-
<div class="modal-body needs-validation">
|
|
1134
|
-
<div class="card card-body">
|
|
1135
|
-
<b>Column Format Settings</b>
|
|
1136
|
-
<div class="form-group row">
|
|
1137
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Data Format</label>
|
|
1138
|
-
<div class="col-sm-7 col-md-7">
|
|
1139
|
-
<select class="form-select" data-bind="options: ['Days', 'Hours', 'Minutes', 'Seconds'].indexOf(fieldFormat()) >= 0 ? ['Days', 'Hours', 'Minutes', 'Seconds'] : $parents[1].fieldFormatTypes, value: fieldFormat"></select>
|
|
1140
|
-
</div>
|
|
1141
|
-
</div>
|
|
1142
|
-
<div class="form-group row" data-bind="visible: $parents[1].decimalFormatTypes.indexOf($data.fieldFormat())>=0">
|
|
1143
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Decimal Places</label>
|
|
1144
|
-
<div class="col-sm-7 col-md-7">
|
|
1145
|
-
<input type="number" class="form-control" data-bind="value: decimalPlaces" placeholder="" />
|
|
1146
|
-
</div>
|
|
1147
|
-
</div>
|
|
1148
|
-
<div class="form-group row" data-bind="visible: fieldFormat()=='Currency'">
|
|
1149
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Currency Format</label>
|
|
1150
|
-
<div class="col-sm-7 col-md-7">
|
|
1151
|
-
<select class="form-select" required data-bind="options: $parents[1].currencyFormats, optionsText: 'display',optionsValue: 'value', value: currencyFormat"></select>
|
|
1152
|
-
</div>
|
|
1153
|
-
</div>
|
|
1154
|
-
<div class="form-group row" data-bind="visible: fieldFormat()=='Date'">
|
|
1155
|
-
<label class="col-sm-5 col-md-5 control-label">Pick Date Format</label>
|
|
1156
|
-
<div class="col-sm-7 col-md-7">
|
|
1157
|
-
<select class="form-select" data-bind="options: $parents[1].dateFormats, value: dateFormat"></select>
|
|
1158
|
-
</div>
|
|
1159
|
-
</div>
|
|
1160
|
-
<div class="form-group row" data-bind="visible:selectedAggregate()=='Pivot' && fieldFormat()=='Date'">
|
|
1161
|
-
<label class="col-sm-5 col-md-5 control-label">Pivot Drilldown Date Format</label>
|
|
1162
|
-
<div class="col-sm-7 col-md-7">
|
|
1163
|
-
<select class="form-select" data-bind="options: ['', 'Day', 'Month', 'Year', 'Month/Year'], value: drillDataFormat"></select>
|
|
1164
|
-
</div>
|
|
1165
|
-
</div>
|
|
1166
|
-
|
|
1167
|
-
<div class="form-group row" data-bind="visible: fieldFormat()=='Date' && dateFormat()==='Custom'">
|
|
1168
|
-
<label class="col-sm-5 col-md-5 control-label">Enter Custom Date Format</label>
|
|
1169
|
-
<div class="col-sm-7 col-md-7">
|
|
1170
|
-
<input type="text" class="form-control" data-bind="value: customDateFormat" placeholder="dd/mm/yyyy" />
|
|
1171
|
-
</div>
|
|
1172
|
-
</div>
|
|
1173
|
-
<div class="form-group row">
|
|
1174
|
-
<label class="col-sm-5 col-md-5 control-label">Choose Column Label</label>
|
|
1175
|
-
<div class="col-sm-7 col-md-7">
|
|
1176
|
-
<input type="text" class="form-control" data-bind="value: fieldLabel" />
|
|
1177
|
-
</div>
|
|
1178
|
-
</div>
|
|
1179
|
-
<div class="form-group row">
|
|
1180
|
-
<label class="col-sm-5 col-md-5 control-label">Inner Column Label</label>
|
|
1181
|
-
<div class="col-sm-7 col-md-7">
|
|
1182
|
-
<input type="text" class="form-control" data-bind="value: fieldLabel2" />
|
|
1183
|
-
</div>
|
|
1184
|
-
</div>
|
|
1185
|
-
<div class="form-group row">
|
|
1186
|
-
<label class="col-sm-5 col-md-5 control-label">Choose Text Alignment</label>
|
|
1187
|
-
<div class="col-sm-7 col-md-7">
|
|
1188
|
-
<select class="form-select" data-bind="options: $parents[1].fieldAlignments, value: fieldAlign"></select>
|
|
1189
|
-
</div>
|
|
1190
|
-
</div>
|
|
1191
|
-
<div class="form-group row">
|
|
1192
|
-
<label class="col-sm-5 col-md-5 control-label">Choose Width (leave blank for auto)</label>
|
|
1193
|
-
<div class="col-sm-7 col-md-7">
|
|
1194
|
-
<input type="text" class="form-control" data-bind="value: fieldWidth" />
|
|
1195
|
-
</div>
|
|
1196
|
-
</div>
|
|
1197
|
-
</div>
|
|
1198
|
-
<br />
|
|
1199
|
-
<div class="card card-body">
|
|
1200
|
-
<div class="form-row align-items-center">
|
|
1201
|
-
<div class="col-auto">
|
|
1202
|
-
<b>Header Settings</b>
|
|
1203
|
-
</div>
|
|
1204
|
-
</div>
|
|
1205
|
-
<div class="row mb-3">
|
|
1206
|
-
<div class="col">
|
|
1207
|
-
<div class="mb-3">
|
|
1208
|
-
<label class="form-label">Pick Text Color</label>
|
|
1209
|
-
<div class="d-flex">
|
|
1210
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerFontColor" />
|
|
1211
|
-
<input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerFontColor" />
|
|
1212
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderFontColor(!applyAllHeaderFontColor()); }">
|
|
1213
|
-
<span class="fa" data-bind="css: applyAllHeaderFontColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1214
|
-
</button>
|
|
1215
|
-
</div>
|
|
1216
|
-
</div>
|
|
1217
|
-
</div>
|
|
1218
|
-
<div class="col">
|
|
1219
|
-
<div class="mb-3">
|
|
1220
|
-
<label class="form-label">Pick Background Color</label>
|
|
1221
|
-
<div class="d-flex">
|
|
1222
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerBackColor" />
|
|
1223
|
-
<input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerBackColor" />
|
|
1224
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBackColor(!applyAllHeaderBackColor()); }">
|
|
1225
|
-
<span class="fa" data-bind="css: applyAllHeaderBackColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1226
|
-
</button>
|
|
1227
|
-
</div>
|
|
1228
|
-
</div>
|
|
1229
|
-
</div>
|
|
1230
|
-
<div class="col d-flex align-items-center">
|
|
1231
|
-
<div class="form-check me-3">
|
|
1232
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: headerFontBold" id="headerFontBoldCheckbox">
|
|
1233
|
-
<label class="form-check-label" for="headerFontBoldCheckbox">
|
|
1234
|
-
Bold Text
|
|
1235
|
-
</label>
|
|
1236
|
-
</div>
|
|
1237
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBold(!applyAllHeaderBold()); }">
|
|
1238
|
-
<span class="fa" data-bind="css: applyAllHeaderBold() ? 'fa-check' : 'fa-paste'"></span>
|
|
1239
|
-
</button>
|
|
1240
|
-
</div>
|
|
1241
|
-
</div>
|
|
1242
|
-
</div>
|
|
1243
|
-
<br />
|
|
1244
|
-
<div class="card card-body">
|
|
1245
|
-
<div class="form-row align-items-center">
|
|
1246
|
-
<div class="col-auto">
|
|
1247
|
-
<b>Text Settings</b>
|
|
1248
|
-
</div>
|
|
1249
|
-
</div>
|
|
1250
|
-
<div class="row mb-3">
|
|
1251
|
-
<div class="col">
|
|
1252
|
-
<div class="mb-3">
|
|
1253
|
-
<label class="form-label">Pick Text Color</label>
|
|
1254
|
-
<div class="d-flex">
|
|
1255
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1256
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1257
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllFontColor(!applyAllFontColor()); }">
|
|
1258
|
-
<span class="fa" data-bind="css: applyAllFontColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1259
|
-
</button>
|
|
1260
|
-
</div>
|
|
1261
|
-
</div>
|
|
1262
|
-
</div>
|
|
1263
|
-
<div class="col">
|
|
1264
|
-
<div class="mb-3">
|
|
1265
|
-
<label class="form-label">Pick Background Color</label>
|
|
1266
|
-
<div class="d-flex">
|
|
1267
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1268
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1269
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBackColor(!applyAllBackColor()); }">
|
|
1270
|
-
<span class="fa" data-bind="css: applyAllBackColor() ? 'fa-check' : 'fa-paste'"></span>
|
|
1271
|
-
</button>
|
|
1272
|
-
</div>
|
|
1273
|
-
</div>
|
|
1274
|
-
</div>
|
|
1275
|
-
<div class="col d-flex align-items-center">
|
|
1276
|
-
<div class="form-check me-3">
|
|
1277
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
|
|
1278
|
-
<label class="form-check-label" for="fontBoldCheckbox">
|
|
1279
|
-
Bold Text
|
|
1280
|
-
</label>
|
|
1281
|
-
</div>
|
|
1282
|
-
<button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBold(!applyAllBold()); }">
|
|
1283
|
-
<span class="fa" data-bind="css: applyAllBold() ? 'fa-check' : 'fa-paste'"></span>
|
|
1284
|
-
</button>
|
|
1285
|
-
</div>
|
|
1286
|
-
</div>
|
|
1287
|
-
</div>
|
|
1288
|
-
<div class="padded-div">
|
|
1289
|
-
<button class="btn btn-sm btn-primary" data-bind="click: function() {addConditionalFormatSetting(null)}">Add Conditional Formatting</button>
|
|
1290
|
-
</div>
|
|
1291
|
-
<div data-bind="foreach: fieldCondtionalFormats" style="padding-left: 40px;">
|
|
1292
|
-
<div class="card card-body">
|
|
1293
|
-
<div class="row m-2">
|
|
1294
|
-
<div class="col d-flex justify-content-start">
|
|
1295
|
-
<b>Conditional Format #<span data-bind="text: $index()+1"></span></b>
|
|
1296
|
-
</div>
|
|
1297
|
-
<div class="col d-flex justify-content-end">
|
|
1298
|
-
<button class="btn btn-sm btn-secondary" data-bind="click: $parent.removeSetting">Remove</button>
|
|
1299
|
-
</div>
|
|
1300
|
-
</div>
|
|
1301
|
-
<div class="row mb-3">
|
|
1302
|
-
<div class="col">
|
|
1303
|
-
<div class="mb-3">
|
|
1304
|
-
<label class="form-label">Pick Text Color</label>
|
|
1305
|
-
<div class="d-flex">
|
|
1306
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1307
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
|
|
1308
|
-
</div>
|
|
1309
|
-
</div>
|
|
1310
|
-
</div>
|
|
1311
|
-
<div class="col">
|
|
1312
|
-
<div class="mb-3">
|
|
1313
|
-
<label class="form-label">Pick Background Color</label>
|
|
1314
|
-
<div class="d-flex">
|
|
1315
|
-
<input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1316
|
-
<input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
|
|
1317
|
-
</div>
|
|
1318
|
-
</div>
|
|
1319
|
-
</div>
|
|
1320
|
-
<div class="col d-flex align-items-center">
|
|
1321
|
-
<div class="form-check me-3">
|
|
1322
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
|
|
1323
|
-
<label class="form-check-label" for="fontBoldCheckbox">
|
|
1324
|
-
Bold Text
|
|
1325
|
-
</label>
|
|
1326
|
-
</div>
|
|
1327
|
-
</div>
|
|
1328
|
-
</div>
|
|
1329
|
-
|
|
1330
|
-
<div class="row m-2" data-bind="foreach: filter.Filters">
|
|
1331
|
-
<div class="col-md-2">
|
|
1332
|
-
Value
|
|
1333
|
-
</div>
|
|
1334
|
-
<div class="col-md-4">
|
|
1335
|
-
<div data-bind="with: Field">
|
|
1336
|
-
<div class="form-group">
|
|
1337
|
-
<select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
|
|
1338
|
-
</div>
|
|
1339
|
-
</div>
|
|
1340
|
-
</div>
|
|
1341
|
-
<div class="col-md-4">
|
|
1342
|
-
<div data-bind="with: Field" data-parentprefix="C">
|
|
1343
|
-
<div data-bind="template: 'report-filter', data: $data"></div>
|
|
1344
|
-
</div>
|
|
1345
|
-
</div>
|
|
1346
|
-
</div>
|
|
1347
|
-
</div>
|
|
1348
|
-
</div>
|
|
1349
|
-
<br />
|
|
1350
|
-
<div class="form-group row" data-bind="if: $parents[1].useStoredProc()">
|
|
1351
|
-
<div class="col-sm-12">
|
|
1352
|
-
<div class="checkbox pull-left" style="padding-top: 5px;">
|
|
1353
|
-
<label>
|
|
1354
|
-
<input type="checkbox" data-bind="checked: checkOuterGroup" />
|
|
1355
|
-
Outer Group
|
|
1356
|
-
</label>
|
|
1357
|
-
</div>
|
|
1358
|
-
</div>
|
|
1359
|
-
</div>
|
|
1360
|
-
</div>
|
|
1361
|
-
<div class="modal-footer">
|
|
1362
|
-
<button type="button" class="btn btn-danger" data-bind="click: cancelFieldOptions">Cancel</button>
|
|
1363
|
-
<button type="button" class="btn btn-primary" data-bind="click: saveFieldOptions">Save Changes</button>
|
|
1364
|
-
</div>
|
|
1365
|
-
</div>
|
|
1366
|
-
</div>
|
|
1367
|
-
</script>
|
|
1368
|
-
|
|
1369
|
-
<script type="text/html" id="report-link-edit">
|
|
1370
|
-
<div class="modal-dialog" style="max-width: 750px;">
|
|
1371
|
-
<div class="modal-content" data-bind="with: editLinkField">
|
|
1372
|
-
<div class="modal-header">
|
|
1373
|
-
<h5 class="modal-title">Setup Link Field</h5>
|
|
1374
|
-
</div>
|
|
1375
|
-
<div class="modal-body needs-validation" data-bind="with: linkFieldItem">
|
|
1376
|
-
<div class="form-group row">
|
|
1377
|
-
<label class="col-sm-5 col-md-5 control-label">This field will link to</label>
|
|
1378
|
-
<div class="col-sm-7 col-md-7">
|
|
1379
|
-
<select class="form-select" required data-bind="options: linkTypes, value: selectedLinkType"></select>
|
|
1380
|
-
</div>
|
|
1381
|
-
</div>
|
|
1382
|
-
<div data-bind="if: LinksToReport">
|
|
1383
|
-
<div class="form-group row">
|
|
1384
|
-
<label class="col-sm-5 col-md-5 control-label">Link to this Report</label>
|
|
1385
|
-
<div class="col-sm-7 col-md-7">
|
|
1386
|
-
<select class="form-select" required data-bind="options: $parentContext.$parent.SavedReports, optionsText: 'reportName', optionsValue: 'reportId', value: LinkedToReportId, optionsCaption: 'Choose the Report to link to'"></select>
|
|
1387
|
-
</div>
|
|
1388
|
-
</div>
|
|
1389
|
-
<div class="checkbox" data-bind="if: LinkedToReportId">
|
|
1390
|
-
<label>
|
|
1391
|
-
<input type="checkbox" data-bind="checked: SendAsFilterParameter" />
|
|
1392
|
-
Send field value as Report Filter Parameter
|
|
1393
|
-
</label>
|
|
1394
|
-
</div>
|
|
1395
|
-
<div class="form-group row" data-bind="if: SendAsFilterParameter">
|
|
1396
|
-
<label class="col-sm-5 col-md-5 control-label">Link to this Report Filter</label>
|
|
1397
|
-
<div class="col-sm-7 col-md-7">
|
|
1398
|
-
<select class="form-select" required data-bind="options: allFields, optionsText: 'fieldName', optionsValue: 'fieldId', value: SelectedFilterId, optionsCaption: 'Choose the Field to Filter by value'"></select>
|
|
1399
|
-
</div>
|
|
1400
|
-
</div>
|
|
1401
|
-
</div>
|
|
1402
|
-
<div data-bind="ifnot: LinksToReport">
|
|
1403
|
-
<div class="form-group row">
|
|
1404
|
-
<label class="col-sm-5 col-md-5 control-label">Link to this URL</label>
|
|
1405
|
-
<div class="col-sm-7 col-md-7">
|
|
1406
|
-
<input type="text" class="form-control" required placeholder="Enter a url to open" data-bind="value: LinkToUrl" title="Valid URL needs to start with http:// or https://">
|
|
1407
|
-
</div>
|
|
1408
|
-
</div>
|
|
1409
|
-
<div class="checkbox">
|
|
1410
|
-
<label>
|
|
1411
|
-
<input type="checkbox" data-bind="checked: SendAsQueryParameter" />
|
|
1412
|
-
Send field value as Query Parameter
|
|
1413
|
-
</label>
|
|
1414
|
-
</div>
|
|
1415
|
-
<div class="form-group row" data-bind="if: SendAsQueryParameter">
|
|
1416
|
-
<label class="col-sm-5 col-md-5 control-label">Parameter Name to use</label>
|
|
1417
|
-
<div class="col-sm-7 col-md-7">
|
|
1418
|
-
<input type="text" class="form-control" required placeholder="Enter parameter name to send value as" data-bind="value: QueryParameterName">
|
|
1419
|
-
</div>
|
|
1420
|
-
</div>
|
|
1421
|
-
<br />
|
|
1422
|
-
</div>
|
|
1423
|
-
</div>
|
|
1424
|
-
<div class="modal-footer">
|
|
1425
|
-
<button type="button" class="btn btn-danger" data-bind="click: removeLinkField">Remove Link</button>
|
|
1426
|
-
<button type="button" class="btn btn-primary" data-bind="click: saveLinkField">Save Changes</button>
|
|
1427
|
-
</div>
|
|
1428
|
-
</div>
|
|
1429
|
-
</div>
|
|
1430
|
-
</script>
|
|
1431
|
-
|
|
1432
|
-
<script type="text/html" id="designer-choose-visual">
|
|
1433
|
-
<div class="btn-group" role="group" aria-label="Visualization Options">
|
|
1434
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('List'); }, css: { active: ReportType()=='List' }">
|
|
1435
|
-
<span class="fa fa-2x fa-list-alt"></span>
|
|
1436
|
-
<p>List</p>
|
|
1437
|
-
</button>
|
|
1438
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Summary'); }, css: { active: ReportType()=='Summary' }">
|
|
1439
|
-
<span class="fa fa-2x fa-table"></span>
|
|
1440
|
-
<p>Summary</p>
|
|
1441
|
-
</button>
|
|
1442
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Bar'); }, css: { active: ReportType()=='Bar' }">
|
|
1443
|
-
<span class="fa fa-2x fa-bar-chart"></span>
|
|
1444
|
-
<p>Bar</p>
|
|
1445
|
-
</button>
|
|
1446
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pie'); }, css: { active: ReportType()=='Pie' }">
|
|
1447
|
-
<span class="fa fa-2x fa-pie-chart"></span>
|
|
1448
|
-
<p>Pie</p>
|
|
1449
|
-
</button>
|
|
1450
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Line'); }, css: { active: ReportType()=='Line' }">
|
|
1451
|
-
<span class="fa fa-2x fa-line-chart"></span>
|
|
1452
|
-
<p>Line</p>
|
|
1453
|
-
</button>
|
|
1454
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Combo'); }, css: { active: ReportType()=='Combo' }">
|
|
1455
|
-
<span class="fa fa-2x fa-signal"></span>
|
|
1456
|
-
<p>Combo</p>
|
|
1457
|
-
</button>
|
|
1458
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Html'); }, css: { active: ReportType()=='Html' }">
|
|
1459
|
-
<span class="fa fa-2x fa-code"></span>
|
|
1460
|
-
<p>Custom</p>
|
|
1461
|
-
</button>
|
|
1462
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Map'); }, css: { active: ReportType().indexOf('Map')==0 }">
|
|
1463
|
-
<span class="fa fa-2x fa-globe"></span>
|
|
1464
|
-
<p>Map</p>
|
|
1465
|
-
</button>
|
|
1466
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('HeatMap'); }, css: { active: ReportType().indexOf('HeatMap')==0 }">
|
|
1467
|
-
<span class="fa fa-2x fa-map"></span>
|
|
1468
|
-
<p>HeatMap</p>
|
|
1469
|
-
</button>
|
|
1470
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Single'); }, css: { active: ReportType()=='Single' }">
|
|
1471
|
-
<span class="fa fa-2x fa-window-maximize"></span>
|
|
1472
|
-
<p>KPI</p>
|
|
1473
|
-
</button>
|
|
1474
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Treemap'); }, css: { active: ReportType()=='Treemap' }">
|
|
1475
|
-
<span class="fa fa-2x fa-window-restore"></span>
|
|
1476
|
-
<p>Treemap</p>
|
|
1477
|
-
</button>
|
|
1478
|
-
<button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pivot'); }, css: { active: ReportType()=='Pivot' }">
|
|
1479
|
-
<span class="fa fa-2x fa-random"></span>
|
|
1480
|
-
<p>Transpose</p>
|
|
1481
|
-
</button>
|
|
1482
|
-
</div>
|
|
1483
|
-
</script>
|
|
1484
|
-
|
|
1485
|
-
<script type="text/html" id="designer-choose-data">
|
|
1486
|
-
<div>
|
|
1487
|
-
<div class="pull-left btn-group btn-group-toggle" role="group" data-bind="if: ReportID() <= 0">
|
|
1488
|
-
<label class="btn btn-sm btn-light active" style="margin-right: 0px;" title="You can change the Data source only when creating a new report, changing this will clear all selections">
|
|
1489
|
-
<input type="radio" name="dataoption" id="table" checked data-bind="checked: useStoredProc, checkedValue: false"> Dynamic
|
|
1490
|
-
</label>
|
|
1491
|
-
<label class="btn btn-sm btn-light active">
|
|
1492
|
-
<input type="radio" name="dataoption" id="proc" value="1" data-bind="checked: useStoredProc, checkedValue: true"> Predefined
|
|
1493
|
-
</label>
|
|
1494
|
-
</div>
|
|
1495
|
-
<div class="pull-right">
|
|
1496
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Formula" data-bind="hidden: isFunctionField() || useStoredProc(), click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Custom Field', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
|
|
1497
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Function" data-bind="hidden: true || isFormulaField() || useStoredProc(), click: function(){designFunctionField()}, text: isFunctionField()? 'Cancel': 'Function Field', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
|
|
1498
|
-
</div>
|
|
1499
|
-
</div>
|
|
1500
|
-
<div class="clearfix"></div>
|
|
1501
|
-
<div class="row">
|
|
1502
|
-
<div class="col-md-12" data-bind="disable: isFormulaField, hidden: useStoredProc">
|
|
1503
|
-
<div data-bind="with: textQuery.searchFields">
|
|
1504
|
-
<select id="search-field" class="form-control" data-bind="select2: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'), placeholder: 'Search for a Data Field...', ajax: { url: url, dataType: 'json', data: query, processResults: processResults, headers: headers }, minimumInputLength: 2, allowClear: true }, value: selectedOption"></select>
|
|
1505
|
-
</div>
|
|
1506
|
-
</div>
|
|
1507
|
-
|
|
1508
|
-
<div class="col-md-12" data-bind="visible: useStoredProc">
|
|
1509
|
-
<div>
|
|
1510
|
-
<select class="form-control" data-bind="select2Value: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card')}, options: Procs, optionsCaption: 'Choose Section...', optionsText: 'DisplayName', value: SelectedProc, visible: useStoredProc"></select>
|
|
1511
|
-
</div>
|
|
1512
|
-
</div>
|
|
1513
|
-
<div class="col-md-12" data-bind="hidden: useStoredProc">
|
|
1514
|
-
<div class="d-flex justify-content-between align-items-center mb-2" style="padding-top: 15px;">
|
|
1515
|
-
<span>
|
|
1516
|
-
Select Data to use in Report
|
|
1517
|
-
<i class="fa fa-info-circle text-muted" data-toggle="tooltip" title="Choose a table to show fields to select."></i>
|
|
1518
|
-
</span>
|
|
1519
|
-
</div>
|
|
1520
|
-
|
|
1521
|
-
<div class="data-select-tree">
|
|
1522
|
-
<!-- ko foreach: CategorizedTables -->
|
|
1523
|
-
<div class="mb-3">
|
|
1524
|
-
<div data-bind="click: function() { isExpanded(!isExpanded()); }, visible: categoryName" style="cursor: pointer;">
|
|
1525
|
-
<i class="fa" data-bind="css: isExpanded() ? 'fa-chevron-down text-secondary' : 'fa-chevron-right text-secondary'"></i>
|
|
1526
|
-
<i class="fa" data-bind="css: isExpanded() ? 'fa-folder-open' : 'fa-folder'"></i>
|
|
1527
|
-
<span data-bind="text: categoryName" class="ml-2"></span>
|
|
1528
|
-
</div>
|
|
1529
|
-
<div class="report-list" data-bind="visible: isExpanded(), foreach: tables" style="padding-left: 15px;">
|
|
1530
|
-
<div class="row border-bottom py-2 w-100">
|
|
1531
|
-
<div class="col-md-12">
|
|
1532
|
-
<div class="pull-left" data-bind="click: function() { selectTable($data); }, css: {'text-muted': !isEnabled()}, style: {cursor: isEnabled() ? 'pointer' : ''}, attr: {title: !isEnabled() ? 'Cannot use table as joins do not exist': ''}">
|
|
1533
|
-
<span class="text-secondary fa" data-bind="css: isEnabled() ? ($data === $parents[1].SelectedTable() ? 'fa-chevron-down' : 'fa-chevron-right') : 'fa-ban'"></span>
|
|
1534
|
-
<span class="fa fa-table"></span> <span data-bind="text: tableName" class=""></span>
|
|
1535
|
-
</div>
|
|
1536
|
-
<div class="pull-right" data-bind="visible: $data === $parents[1].SelectedTable() && !$parents[1].isFormulaField() && !$parents[1].SelectedTable().dynamicColumns">
|
|
1537
|
-
<a href="#" class="small text-muted" data-bind="click: $parents[1].MoveAllFields">Select all</a> |
|
|
1538
|
-
<a href="#" class="small text-muted" data-bind="click: $parents[1].RemoveSelectedFields">Remove all</a>
|
|
1539
|
-
</div>
|
|
1540
|
-
</div>
|
|
1541
|
-
|
|
1542
|
-
<!-- Fields Expand Here -->
|
|
1543
|
-
<div data-bind="visible: $data === $parents[1].SelectedTable()" style="padding-left: 30px;">
|
|
1544
|
-
<!-- ko foreach: $parents[1].ChooseFields -->
|
|
1545
|
-
<div class="row border-bottom py-2 align-items-center w-100">
|
|
1546
|
-
<div class="checkbox">
|
|
1547
|
-
<label>
|
|
1548
|
-
<input type="checkbox" data-bind="checkedInArray: {array: $parents[2].isFormulaField() ? $parents[2].formulaFields : $parents[2].SelectedFields, value: $data}">
|
|
1549
|
-
<span data-bind="text: fieldName"></span>
|
|
1550
|
-
</label>
|
|
1551
|
-
</div>
|
|
1552
|
-
</div>
|
|
1553
|
-
<!--/ko-->
|
|
1554
|
-
</div>
|
|
1555
|
-
</div>
|
|
1556
|
-
</div>
|
|
1557
|
-
</div>
|
|
1558
|
-
<!-- /ko -->
|
|
1559
|
-
</div>
|
|
1560
|
-
</div>
|
|
1561
|
-
</div>
|
|
1562
|
-
</script>
|
|
1563
|
-
|
|
1564
|
-
<script type="text/html" id="designer-selected-data">
|
|
1565
|
-
<div data-bind="visible: SelectedFields().length == 0">
|
|
1566
|
-
Please choose data
|
|
1567
|
-
</div>
|
|
1568
|
-
<div data-bind="if: SelectedFields().length > 0">
|
|
1569
|
-
<div data-bind="visible: ReportType()=='Bar'" class="card card-body">
|
|
1570
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1571
|
-
<span class="fa fa-lightbulb-o"></span> For Bar Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis.
|
|
1572
|
-
</div>
|
|
1573
|
-
<div class="form-group row small">
|
|
1574
|
-
<div class="checkbox col-6">
|
|
1575
|
-
<label>
|
|
1576
|
-
<input type="checkbox" data-bind="checked: barChartHorizontal" />
|
|
1577
|
-
Horizontal Bar Chart
|
|
1578
|
-
</label>
|
|
1579
|
-
</div>
|
|
1580
|
-
<div class="checkbox col-6">
|
|
1581
|
-
<label>
|
|
1582
|
-
<input type="checkbox" data-bind="checked: barChartStacked" />
|
|
1583
|
-
Stacked Bar Chart
|
|
1584
|
-
</label>
|
|
1585
|
-
</div>
|
|
1586
|
-
</div>
|
|
1587
|
-
</div>
|
|
1588
|
-
|
|
1589
|
-
<div data-bind="visible: ReportType()=='Pie'" class="card card-body">
|
|
1590
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1591
|
-
<span class="fa fa-lightbulb-o"></span> For Pie Graph, the first field below will be grouped, and the first numeric field will show as the ratio.
|
|
1592
|
-
</div>
|
|
1593
|
-
<div class="form-group row small">
|
|
1594
|
-
<div class="checkbox col-6">
|
|
1595
|
-
<label>
|
|
1596
|
-
<input type="checkbox" data-bind="checked: pieChartDonut" />
|
|
1597
|
-
Donut Chart
|
|
1598
|
-
</label>
|
|
1599
|
-
</div>
|
|
1600
|
-
</div>
|
|
1601
|
-
</div>
|
|
1602
|
-
|
|
1603
|
-
<div data-bind="visible: ReportType()=='Treemap'" class="card card-body">
|
|
1604
|
-
<div class="alert alert-info small py-1 mb-0">
|
|
1605
|
-
<span class="fa fa-lightbulb-o"></span> For Treemap, the data must be in a hierarchical format with 2nd column having parent and third column having a numeric value. The data must have a single root node having null as its parent as well.
|
|
1606
|
-
</div>
|
|
1607
|
-
</div>
|
|
1608
|
-
<div data-bind="visible: ReportType()=='HeatMap'" class="card card-body">
|
|
1609
|
-
<div class="alert alert-info mb-3">
|
|
1610
|
-
<span class="fa fa-lightbulb-o fa-2x"></span> For HeatMap, the first two columns must be numeric values representing
|
|
1611
|
-
<strong>Latitude</strong> and <strong>Longitude</strong>. At least one additional numeric column is required to provide the
|
|
1612
|
-
<strong>intensity</strong> of each point.
|
|
1613
|
-
</div>
|
|
1614
|
-
|
|
1615
|
-
<div class="form-group row mb-2">
|
|
1616
|
-
<div class="checkbox col-6">
|
|
1617
|
-
<label>
|
|
1618
|
-
<input type="checkbox" data-bind="checked: heatMapOptions.showMarker" />
|
|
1619
|
-
Show Marker
|
|
1620
|
-
</label>
|
|
1621
|
-
</div>
|
|
1622
|
-
</div>
|
|
1623
|
-
|
|
1624
|
-
<div class="form-group row mb-3">
|
|
1625
|
-
<label class="col-12 fw-bold">Heatmap Colors</label>
|
|
1626
|
-
|
|
1627
|
-
<div class="col-4 mb-2">
|
|
1628
|
-
<input type="color" class="color-picker"
|
|
1629
|
-
data-bind="value: heatMapOptions.gradient1" title="Gradient 1" />
|
|
1630
|
-
</div>
|
|
1631
|
-
<div class="col-4 mb-2">
|
|
1632
|
-
<input type="color" class="color-picker"
|
|
1633
|
-
data-bind="value: heatMapOptions.gradient2" title="Gradient 2" />
|
|
1634
|
-
</div>
|
|
1635
|
-
<div class="col-4 mb-2">
|
|
1636
|
-
<input type="color" class="color-picker"
|
|
1637
|
-
data-bind="value: heatMapOptions.gradient3" title="Gradient 3" />
|
|
1638
|
-
</div>
|
|
1639
|
-
</div>
|
|
1640
|
-
</div>
|
|
1641
|
-
|
|
1642
|
-
<div data-bind="visible: ReportType()=='Line'" class="card card-body">
|
|
1643
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1644
|
-
<span class="fa fa-lightbulb-o"></span> For Line Graph, the first field below will show on the x-axis. All other fields will numeric fields will show on y-axis.
|
|
1645
|
-
</div>
|
|
1646
|
-
<div class="form-group row small">
|
|
1647
|
-
<div class="checkbox col-6">
|
|
1648
|
-
<label>
|
|
1649
|
-
<input type="checkbox" data-bind="checked: lineChartArea" />
|
|
1650
|
-
Area Chart
|
|
1651
|
-
</label>
|
|
1652
|
-
</div>
|
|
1653
|
-
</div>
|
|
1654
|
-
</div>
|
|
1655
|
-
|
|
1656
|
-
<div data-bind="visible: ReportType()=='Combo'" class="card card-body">
|
|
1657
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1658
|
-
<span class="fa fa-lightbulb-o"></span> For Combo Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis, and you can choose display each series as line, bar or area.
|
|
1659
|
-
</div>
|
|
1660
|
-
<div class="form-group row small">
|
|
1661
|
-
<div class="col-6">
|
|
1662
|
-
<label>Default Series Type</label>
|
|
1663
|
-
<select class="form-select form-select-sm" data-bind="options: seriesTypes, value: comboChartType"></select>
|
|
1664
|
-
</div>
|
|
1665
|
-
</div>
|
|
1666
|
-
</div>
|
|
1667
|
-
|
|
1668
|
-
<div data-bind="visible: ReportType()=='Pivot'" class="card card-body">
|
|
1669
|
-
<div class="alert alert-info small py-1 mb-0">
|
|
1670
|
-
<span class="fa fa-lightbulb-o"></span> For Transpose, the first field below will be used to Pivot/Transpose the rows as columns, and it must be grouped.
|
|
1671
|
-
</div>
|
|
1672
|
-
</div>
|
|
1673
|
-
|
|
1674
|
-
<div data-bind="visible: ReportType()=='Single'" class="card card-body">
|
|
1675
|
-
<div class="alert alert-info small py-1 mb-0">
|
|
1676
|
-
<span class="fa fa-lightbulb-o"></span> KPI is a single value report that is ideal for placing on a Dashboard. All fields except one must be hidden for Widgets.
|
|
1677
|
-
</div>
|
|
1678
|
-
</div>
|
|
1679
|
-
|
|
1680
|
-
<div data-bind="visible: ReportType()=='Html'" class="card card-body">
|
|
1681
|
-
<div class="form-group row small">
|
|
1682
|
-
<div class="checkbox col-6">
|
|
1683
|
-
<label>
|
|
1684
|
-
<input type="checkbox" data-bind="checked: dontGroupCustom" />
|
|
1685
|
-
List (Don't Summarize)
|
|
1686
|
-
</label>
|
|
1687
|
-
</div>
|
|
1688
|
-
</div>
|
|
1689
|
-
</div>
|
|
1690
|
-
|
|
1691
|
-
<div data-bind="visible: ReportType()=='Map'" class="card card-body">
|
|
1692
|
-
<div class="alert alert-info small py-1 mb-2">
|
|
1693
|
-
<span class="fa fa-lightbulb-o"></span> For Map Graph, the first field below has to be a Region, like a Country.
|
|
1694
|
-
</div>
|
|
1695
|
-
<div class="form-group row small">
|
|
1696
|
-
<label class="col-sm-3 control-label">Map Display</label>
|
|
1697
|
-
<div class="col-sm-5">
|
|
1698
|
-
<select class="form-select form-select-sm" data-bind="options: mapRegions, value: mapRegion"></select>
|
|
1699
|
-
</div>
|
|
1700
|
-
</div>
|
|
1701
|
-
</div>
|
|
1702
|
-
</div>
|
|
1703
|
-
<ul class="list-group" data-bind="sortable: { data: SelectedFields, options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }, strategyMove: true }">
|
|
1704
|
-
<li class="list-group-item">
|
|
1705
|
-
<div class="row">
|
|
1706
|
-
<div class="col-5">
|
|
1707
|
-
<span class="sortable pull-left" style="padding-right: 15px;" data-bind="ifnot: $parent.useStoredProc">
|
|
1708
|
-
<span class="fa fa-ellipsis-v" aria-hidden="true" title="Drag to reorder"></span>
|
|
1709
|
-
</span>
|
|
1710
|
-
<span class="fa fa-columns"></span>
|
|
1711
|
-
<span data-bind="text: selectedFieldName"></span>
|
|
1712
|
-
<span data-bind="text: isFormulaField() ? '(' + fieldFormat() + ')' : ''"></span>
|
|
1713
|
-
<span data-bind="visible: !$parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.ReportType() !='Treemap' && $parent.isChart()">
|
|
1714
|
-
<span class="badge bg-danger" data-bind="visible: !groupInGraph()">Will not show in <span data-bind="text: $parent.ReportType"></span>Chart</span>
|
|
1715
|
-
</span>
|
|
1716
|
-
<span data-bind="visible: $parent.IsPivotFieldLastColumn($index(),selectedAggregate())">
|
|
1717
|
-
<span class="badge bg-danger" >Pivot field cannot be the last column.</span>
|
|
1718
|
-
</span>
|
|
1719
|
-
<span data-bind="visible: $parent.IsDynamicFieldFirstColumn($index())">
|
|
1720
|
-
<span class="badge bg-danger" >Dynamic cannot be first column.</span>
|
|
1721
|
-
</span>
|
|
1722
|
-
</div>
|
|
1723
|
-
<div class="col-7">
|
|
1724
|
-
<div class="pull-right" style="margin-top: -5px;" data-bind="if: $parent.AggregateReport() && !$parent.useStoredProc()">
|
|
1725
|
-
<select class="form-select form-control-sm" data-bind="options: $parent.canDrilldown() && $index()>0 ? fieldAggregateWithDrilldown : fieldAggregate, value: selectedAggregate"></select>
|
|
1726
|
-
</div>
|
|
1727
|
-
|
|
1728
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
|
|
1729
|
-
<span class="fa fa-trash-o" title="Cannot Delete Required Filter" data-bind="visible: forceFilterForTable"></span>
|
|
1730
|
-
<span class="fa fa-trash" style="cursor: pointer;" aria-hidden="true" title="Delete this Field" data-bind="click: $parent.RemoveField, hidden: forceFilterForTable"></span>
|
|
1731
|
-
</div>
|
|
1732
|
-
<!--<div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
|
|
1733
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {active: filterOnFly()==true}">
|
|
1734
|
-
<span class="fa fa-filter" aria-hidden="true" title="Filter by this field on the Report"></span>
|
|
1735
|
-
</span>
|
|
1736
|
-
</div>-->
|
|
1737
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
|
|
1738
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: toggleDisable, css: {active: disabled()==true}">
|
|
1739
|
-
<span class="fa fa-close" aria-hidden="true" title="Do not include in Report"></span>
|
|
1740
|
-
</span>
|
|
1741
|
-
</div>
|
|
1742
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot' && $parent.ReportType()!='List' && !$parent.useStoredProc()">
|
|
1743
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ hideInDetail(!hideInDetail()); }, css: {active: hideInDetail()==true}">
|
|
1744
|
-
<span class="fa fa-eye-slash" aria-hidden="true" title="Hide in Details"></span>
|
|
1745
|
-
</span>
|
|
1746
|
-
</div>
|
|
1747
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
|
|
1748
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ groupInGraph(!groupInGraph()); }, css: {active: groupInGraph()==false}">
|
|
1749
|
-
<span class="fa fa-signal" aria-hidden="true" title="Include in series"></span>
|
|
1750
|
-
</span>
|
|
1751
|
-
</div>
|
|
1752
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.IncludeSubTotal() && (['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldType) >= 0 || ['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldFormat()) >= 0)">
|
|
1753
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ dontSubTotal(!dontSubTotal()); }, css: {active: dontSubTotal()==true}">
|
|
1754
|
-
<span class="fa fa-plus-circle" aria-hidden="true" title="Don't add to Total row"></span>
|
|
1755
|
-
</span>
|
|
1756
|
-
</div>
|
|
1757
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
|
|
1758
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: setupLinkField, css: {active: linkField()==true}">
|
|
1759
|
-
<span class="fa fa-link" aria-hidden="true" title="Link to another Report or Url"></span>
|
|
1760
|
-
</span>
|
|
1761
|
-
</div>
|
|
1762
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()=='Combo' && $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
|
|
1763
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: function(){ seriesType(seriesType() == 'line' ? 'area' : (seriesType()=='bars' ? 'line' : 'bars')); }">
|
|
1764
|
-
<span class="fa" aria-hidden="true" data-bind="css: {'fa-line-chart': seriesType() == 'line', 'fa-bar-chart': seriesType() == 'bars', 'fa-area-chart': seriesType()=='area' }, attr: {title: seriesType}"></span>
|
|
1765
|
-
</span>
|
|
1766
|
-
</div>
|
|
1767
|
-
<div class="pull-right" style="padding-right: 10px;">
|
|
1768
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: setupFieldOptions">
|
|
1769
|
-
<span class="fa fa-gear" aria-hidden="true" title="More Options"></span>
|
|
1770
|
-
</span>
|
|
1771
|
-
</div>
|
|
1772
|
-
<div class="pull-right" style="padding-right: 10px;" data-bind="if: isFormulaField">
|
|
1773
|
-
<span class="button-box no-padding" tabindex="0" data-bind="click: editFormulaField">
|
|
1774
|
-
<span class="fa fa-pencil" aria-hidden="true" title="Edit Formula Field"></span>
|
|
1775
|
-
</span>
|
|
1776
|
-
</div>
|
|
1777
|
-
</div>
|
|
1778
|
-
</div>
|
|
1779
|
-
</li>
|
|
1780
|
-
</ul>
|
|
1781
|
-
</script>
|
|
1782
|
-
|
|
1783
|
-
<script type="text/html" id="designer-sub-report">
|
|
1784
|
-
<p class="text-muted mb-3">
|
|
1785
|
-
Linked reports are available to add as sub reports.
|
|
1786
|
-
Selecting sub reports will restrict the report to <strong>one record per page</strong>.
|
|
1787
|
-
</p>
|
|
1788
|
-
|
|
1789
|
-
<div class="mb-3">
|
|
1790
|
-
<select class="form-select"
|
|
1791
|
-
data-bind="options: linkedReportFields,
|
|
1792
|
-
optionsText: 'name',
|
|
1793
|
-
value: selectedSubReport,
|
|
1794
|
-
optionsCaption: 'Select a linked report...'">
|
|
1795
|
-
</select>
|
|
1796
|
-
</div>
|
|
1797
|
-
<ul class="list-group"
|
|
1798
|
-
data-bind="sortable: {
|
|
1799
|
-
data: subReports,
|
|
1800
|
-
options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }
|
|
1801
|
-
}">
|
|
1802
|
-
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
1803
|
-
<span>
|
|
1804
|
-
<i class="fa fa-bars sortable me-2" style="cursor:move;"></i>
|
|
1805
|
-
<span data-bind="text: name"></span>
|
|
1806
|
-
</span>
|
|
1807
|
-
<button type="button" class="btn btn-sm btn-outline-danger"
|
|
1808
|
-
data-bind="click: $parent.removeSubReport">
|
|
1809
|
-
Delete
|
|
1810
|
-
</button>
|
|
1811
|
-
</li>
|
|
1812
|
-
</ul>
|
|
1813
|
-
</script>
|
|
1814
|
-
|
|
1815
|
-
<script type="text/html" id="designer-html">
|
|
1816
|
-
<div class="row align-items-center mb-1">
|
|
1817
|
-
<div class="col-md-4">
|
|
1818
|
-
<select class="form-select" data-bind="options: SelectedFields, value: SelectFieldToInsert, optionsCaption: 'Select a field...', optionsText: 'selectedFieldName'"></select>
|
|
1819
|
-
</div>
|
|
1820
|
-
<div class="col-auto dropdown">
|
|
1821
|
-
<button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown">
|
|
1822
|
-
<i class="fa fa-table"></i> Insert as Table
|
|
1823
|
-
</button>
|
|
1824
|
-
<ul class="dropdown-menu">
|
|
1825
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableTransposed">Transposed</a></li>
|
|
1826
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableStandard">Standard</a></li>
|
|
1827
|
-
<li><hr class="dropdown-divider"></li>
|
|
1828
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertHeaderBreak">Add Header Break</a></li>
|
|
1829
|
-
<li><a class="dropdown-item" href="#" data-bind="click: insertFooterBreak">Add Footer Break</a></li>
|
|
1830
|
-
</ul>
|
|
1831
|
-
</div>
|
|
1832
|
-
|
|
1833
|
-
<div class="col-md-auto ms-2">
|
|
1834
|
-
<label class="form-check-label">
|
|
1835
|
-
<input class="form-check-input me-2" type="checkbox" data-bind="checked: cardView">
|
|
1836
|
-
Card Layout
|
|
1837
|
-
</label>
|
|
1838
|
-
</div>
|
|
1839
|
-
</div>
|
|
1840
|
-
<div class="mb-3">
|
|
1841
|
-
<textarea data-bind="summernote: reportHtml"></textarea>
|
|
1842
|
-
</div>
|
|
1843
|
-
</script>
|
|
1844
|
-
|
|
1845
|
-
<script type="text/html" id="designer-sort">
|
|
1846
|
-
<div data-bind="ifnot: useStoredProc">
|
|
1847
|
-
<div class="form-group row align-items-center flex-nowrap">
|
|
1848
|
-
<label class="col-auto control-label">Sort By</label>
|
|
1849
|
-
<div class="col">
|
|
1850
|
-
<select class="form-select form-select-sm"
|
|
1851
|
-
data-bind="options: FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: SortByField, optionsCaption: 'Select field to sort...', allowClear: true">
|
|
1852
|
-
</select>
|
|
1853
|
-
</div>
|
|
1854
|
-
<div class="col-auto d-flex gap-1">
|
|
1855
|
-
<button class="btn btn-sm btn-secondary"
|
|
1856
|
-
data-bind="text: !SortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { SortDesc(!SortDesc()); return false; }">
|
|
1857
|
-
</button>
|
|
1858
|
-
<button class="btn btn-sm btn-secondary"
|
|
1859
|
-
data-bind="click: addSortField">
|
|
1860
|
-
Add Sort
|
|
1861
|
-
</button>
|
|
1862
|
-
</div>
|
|
1863
|
-
</div>
|
|
1864
|
-
|
|
1865
|
-
<div data-bind="foreach: SortFields">
|
|
1866
|
-
<div class="form-group row align-items-center flex-nowrap">
|
|
1867
|
-
<label class="col-auto control-label"> Then Sort By</label>
|
|
1868
|
-
<div class="col">
|
|
1869
|
-
<select class="form-select form-select-sm" required
|
|
1870
|
-
data-bind="options: $parent.FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: sortByFieldId">
|
|
1871
|
-
</select>
|
|
1872
|
-
</div>
|
|
1873
|
-
<div class="col-auto d-flex gap-1">
|
|
1874
|
-
<button class="btn btn-sm btn-secondary"
|
|
1875
|
-
data-bind="click: remove">
|
|
1876
|
-
Remove Sort
|
|
1877
|
-
</button>
|
|
1878
|
-
<button class="btn btn-sm btn-secondary"
|
|
1879
|
-
data-bind="text: !sortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { sortDesc(!sortDesc()); return false; }">
|
|
1880
|
-
</button>
|
|
1881
|
-
<button class="btn btn-sm btn-secondary"
|
|
1882
|
-
data-bind="click: $parent.addSortField">
|
|
1883
|
-
Add Sort
|
|
1884
|
-
</button>
|
|
1885
|
-
</div>
|
|
1886
|
-
</div>
|
|
1887
|
-
</div>
|
|
1888
|
-
</div>
|
|
1889
|
-
</script>
|
|
1890
|
-
|
|
1891
|
-
<script type="text/html" id="designer-options">
|
|
1892
|
-
<div class="row">
|
|
1893
|
-
<div class="col-md-5">
|
|
1894
|
-
<div class="checkbox" data-bind="visible: ReportType()!='Pivot'">
|
|
1895
|
-
<label>
|
|
1896
|
-
<input type="checkbox" data-bind="checked: IncludeSubTotal" />
|
|
1897
|
-
Include Total Row
|
|
1898
|
-
</label>
|
|
1899
|
-
</div>
|
|
1900
|
-
<div class="checkbox" data-bind="hidden: AggregateReport">
|
|
1901
|
-
<label>
|
|
1902
|
-
<input type="checkbox" data-bind="checked: ShowUniqueRecords" />
|
|
1903
|
-
Show only Unique Records
|
|
1904
|
-
</label>
|
|
1905
|
-
</div>
|
|
1906
|
-
<div class="checkbox" data-bind="visible: ReportType()!='List'">
|
|
1907
|
-
<label>
|
|
1908
|
-
<input type="checkbox" data-bind="checked: ShowExpandOption" />
|
|
1909
|
-
Don't Show Expand Option
|
|
1910
|
-
</label>
|
|
1911
|
-
</div>
|
|
1912
|
-
<div class="checkbox" data-bind="visible: isChart">
|
|
1913
|
-
<label>
|
|
1914
|
-
<input type="checkbox" data-bind="checked: ShowDataWithGraph" />
|
|
1915
|
-
Show Data along with Graph
|
|
1916
|
-
</label>
|
|
1917
|
-
</div>
|
|
1918
|
-
<div class="checkbox">
|
|
1919
|
-
<label>
|
|
1920
|
-
<input type="checkbox" data-bind="checked: DontExecuteOnRun" />
|
|
1921
|
-
Wait to Select Filters before Running Report
|
|
1922
|
-
</label>
|
|
1923
|
-
</div>
|
|
1924
|
-
<div class="form-group row">
|
|
1925
|
-
<div class="checkbox col-md-5">
|
|
1926
|
-
<label>
|
|
1927
|
-
<input type="checkbox" data-bind="checked: maxRecords" />
|
|
1928
|
-
Max Records
|
|
1929
|
-
</label>
|
|
1930
|
-
</div>
|
|
1931
|
-
<div class="col-md-5" data-bind="if: maxRecords">
|
|
1932
|
-
<input type="number" style="width: 150px;" class="form-control" required placeholder="Only top n..." data-bind="value: OnlyTop, visible: maxRecords">
|
|
1933
|
-
</div>
|
|
1934
|
-
</div>
|
|
1935
|
-
<div class="form-group row">
|
|
1936
|
-
<div class="checkbox col-md-5">
|
|
1937
|
-
<label>
|
|
1938
|
-
<input type="checkbox" data-bind="checked: changePageSize, disable: subReports().length > 0" />
|
|
1939
|
-
Change Page Size
|
|
1940
|
-
</label>
|
|
1941
|
-
</div>
|
|
1942
|
-
<div class="col-md-5"
|
|
1943
|
-
data-bind="visible: changePageSize,
|
|
1944
|
-
css: { 'text-muted': subReports().length > 0 }">
|
|
1945
|
-
<select style="width: 150px;" class="form-select"
|
|
1946
|
-
data-bind="options: [1,10,30,50,100,150,200,500,1000],
|
|
1947
|
-
value: DefaultPageSize,
|
|
1948
|
-
disable: subReports().length > 0">
|
|
1949
|
-
</select>
|
|
1950
|
-
<!-- Force default to 1 if sub reports selected -->
|
|
1951
|
-
<small class="text-danger" data-bind="visible: subReports().length > 0">
|
|
1952
|
-
Page size is restricted to 1 when sub reports are selected.
|
|
1953
|
-
</small>
|
|
1954
|
-
</div>
|
|
1955
|
-
</div>
|
|
1956
|
-
</div>
|
|
1957
|
-
<div class="col-md-7">
|
|
1958
|
-
<p><span class="fa fa-paint-brush"></span> Pick Report Format</p>
|
|
1959
|
-
<div>
|
|
1960
|
-
<!-- ko foreach: tableStyles -->
|
|
1961
|
-
<div class="dropdown-option" data-bind="title: $data.name, click: $parent.selectStyle, css: {'dropdown-option-selected': $parent.selectedStyle() == $data.colorscheme}">
|
|
1962
|
-
<div class="mini-table-preview" data-bind="foreach: new Array(5)">
|
|
1963
|
-
<div class="mini-table-row" data-bind="foreach: new Array(5)">
|
|
1964
|
-
<div class="mini-table-cell" data-bind="style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }"></div>
|
|
1965
|
-
|
|
1966
|
-
</div>
|
|
1967
|
-
</div>
|
|
1968
|
-
</div>
|
|
1969
|
-
<!-- /ko -->
|
|
1970
|
-
</div>
|
|
1971
|
-
<div class="checkbox">
|
|
1972
|
-
<label>
|
|
1973
|
-
<input type="checkbox" data-bind="checked: noHeaderRow" />
|
|
1974
|
-
No Header Row
|
|
1975
|
-
</label>
|
|
1976
|
-
</div>
|
|
1977
|
-
<div class="checkbox">
|
|
1978
|
-
<label>
|
|
1979
|
-
<input type="checkbox" data-bind="checked: noDashboardBorders" />
|
|
1980
|
-
Borderless on Dashboard
|
|
1981
|
-
</label>
|
|
1982
|
-
</div>
|
|
1983
|
-
<div class="checkbox" data-bind="if: ReportType() == 'Single'">
|
|
1984
|
-
<label>
|
|
1985
|
-
<input type="checkbox" data-bind="checked: showPriorInKpi" />
|
|
1986
|
-
Show previous comparision in KPI if applicable
|
|
1987
|
-
</label>
|
|
1988
|
-
</div>
|
|
1989
|
-
</div>
|
|
1990
|
-
</div>
|
|
1991
|
-
</script>
|
|
1992
|
-
|
|
1993
|
-
<script type="text/html" id="custom-field-designer">
|
|
1994
|
-
<div>
|
|
1995
|
-
<div class="row">
|
|
1996
|
-
<div class="col-md-12" data-bind="visible: isFormulaField()">
|
|
1997
|
-
<div class="alert alert-info">
|
|
1998
|
-
You are now creating a Customized Field. Please select the fields you want to use in the calculation, then choose the operations you want to perform, and click "Save" to add your Custom field.
|
|
1999
|
-
</div>
|
|
2000
|
-
</div>
|
|
2001
|
-
</div>
|
|
2002
|
-
<div class="row">
|
|
2003
|
-
<div class="col-sm-6 small">
|
|
2004
|
-
Setup your Formula for calculating this Field
|
|
2005
|
-
</div>
|
|
2006
|
-
<div class="col-sm-6 right-align" data-bind="visible: formulaType()=='build'">
|
|
2007
|
-
<a href="#" class="btn btn-secondary btn-sm" data-bind="click: addFormulaParentheses">Add ( )</a>
|
|
2008
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add Today" data-bind="visible: formulaOnlyHasDateFields() || formulaFields().length == 0, click: addFormulaDateToday">Add Today</a>
|
|
2009
|
-
<a href="#" class="btn btn-secondary btn-sm" title="Add a Constant Value" data-bind="click: addFormulaConstantValue">Add Value</a>
|
|
2010
|
-
<a href="#" class="btn btn-secondary btn-sm" data-bind="click: clearFormulaField">Clear</a>
|
|
2011
|
-
</div>
|
|
2012
|
-
</div>
|
|
2013
|
-
<div class="form-group-row" data-bind="if: formulaOnlyHasDateFields">
|
|
2014
|
-
<div class="col-sm-12">
|
|
2015
|
-
<div class="alert alert-info">
|
|
2016
|
-
For Dates Field calculation, you can only substract date fields and display the result as days, hours, minutes or seconds.
|
|
2017
|
-
</div>
|
|
2018
|
-
</div>
|
|
2019
|
-
</div>
|
|
2020
|
-
<div class="form-group row">
|
|
2021
|
-
<label class="col-sm-2 control-label">Field Label</label>
|
|
2022
|
-
<div class="col-sm-10">
|
|
2023
|
-
<input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
|
|
2024
|
-
</div>
|
|
2025
|
-
</div>
|
|
2026
|
-
<div class="form-group row">
|
|
2027
|
-
<label class="col-sm-2 control-label">Data Format</label>
|
|
2028
|
-
<div class="col-sm-10">
|
|
2029
|
-
<select class="form-select form-select-sm" data-bind="value: formulaDataFormat" required>
|
|
2030
|
-
<!-- ko ifnot: formulaOnlyHasDateFields -->
|
|
2031
|
-
<option>String</option>
|
|
2032
|
-
<option>Integer</option>
|
|
2033
|
-
<option>Decimal</option>
|
|
2034
|
-
<option>Currency</option>
|
|
2035
|
-
<!-- /ko -->
|
|
2036
|
-
<!-- ko if: formulaOnlyHasDateFields -->
|
|
2037
|
-
<option>Days</option>
|
|
2038
|
-
<option>Hours</option>
|
|
2039
|
-
<option>Minutes</option>
|
|
2040
|
-
<option>Seconds</option>
|
|
2041
|
-
<!-- /ko -->
|
|
2042
|
-
</select>
|
|
2043
|
-
</div>
|
|
2044
|
-
</div>
|
|
2045
|
-
<div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
|
|
2046
|
-
<label class="col-sm-2 control-label">Round to Decimal Places</label>
|
|
2047
|
-
<div class="col-sm-10">
|
|
2048
|
-
<input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
|
|
2049
|
-
</div>
|
|
2050
|
-
</div>
|
|
2051
|
-
<div class="form-group row" data-bind="visible: appSettings.useSqlCustomField">
|
|
2052
|
-
<label class="col-sm-2 control-label">Field Builder Type</label>
|
|
2053
|
-
<div class="col-sm-10">
|
|
2054
|
-
<select class="form-select form-select-sm" data-bind="value: formulaType" required>
|
|
2055
|
-
<option value="build">Simple Calculation</option>
|
|
2056
|
-
<option value="sql">Advanced Expression</option>
|
|
2057
|
-
</select>
|
|
2058
|
-
</div>
|
|
2059
|
-
</div>
|
|
2060
|
-
|
|
2061
|
-
<div class="form-group row" data-bind="if: formulaType()=='build'">
|
|
2062
|
-
<label class="col-sm-2 control-label">Field Formula</label>
|
|
2063
|
-
<div class="col-sm-10">
|
|
2064
|
-
<div class="text-muted small" data-bind="visible: formulaFields().length == 0">Pick fields to build calculation</div>
|
|
2065
|
-
<div class="d-flex align-items-center flex-wrap" data-bind="foreach: formulaFields">
|
|
2066
|
-
<h3 class="me-3" data-bind="visible: setupFormula.isParenthesesStart" style="margin-top: 0;">(</h3>
|
|
2067
|
-
<div data-bind="if: !setupFormula.isParenthesesStart() && !setupFormula.isParenthesesEnd()" class="list-group me-3">
|
|
2068
|
-
<div class="list-group-item d-flex align-items-center formula-field-item" style="margin-left: 15px; padding: 5px 15px">
|
|
2069
|
-
<span data-bind="text: fieldName, visible: !setupFormula.isConstantValue()"></span>
|
|
2070
|
-
<div data-bind="if: setupFormula.isConstantValue" class="d-flex align-items-center">
|
|
2071
|
-
<input data-bind="value: setupFormula.constantValue, visible: setupFormula.constantValue()!='|Today|'" class="form-control form-control-sm me-2" required />
|
|
2072
|
-
<span data-bind="visible: setupFormula.constantValue() == '|Today|'"><b>Today</b></span>
|
|
2073
|
-
</div>
|
|
2074
|
-
<button class="btn btn-danger btn-sm ms-2" data-bind="click: $parent.removeField">
|
|
2075
|
-
<i class="fa fa-trash"></i>
|
|
2076
|
-
</button>
|
|
2077
|
-
</div>
|
|
2078
|
-
</div>
|
|
2079
|
-
<h3 class="me-3" data-bind="visible: setupFormula.isParenthesesEnd" style="margin-top: 0;">)</h3>
|
|
2080
|
-
<div class="me-3" style="margin-left: 15px;" data-bind="visible: $parent.showFormulaOperation($index())">
|
|
2081
|
-
<select class="form-control form-control-sm" style="max-width: 50px;" data-bind="value: setupFormula.formulaOperation">
|
|
2082
|
-
<!-- ko if: !$parent.formulaOnlyHasDateFields() || ($parent.formulaOnlyHasDateFields() && $parent.isConstantOperation($index())) -->
|
|
2083
|
-
<option>+</option>
|
|
2084
|
-
<!-- /ko -->
|
|
2085
|
-
<option>-</option>
|
|
2086
|
-
<!-- ko if: ['Integer','Money','Float','Double','Decimal','Currency'].indexOf($parent.formulaDataFormat()) != -1 -->
|
|
2087
|
-
<option>*</option>
|
|
2088
|
-
<option>/</option>
|
|
2089
|
-
<!-- /ko -->
|
|
2090
|
-
</select>
|
|
2091
|
-
</div>
|
|
2092
|
-
</div>
|
|
2093
|
-
|
|
2094
|
-
</div>
|
|
2095
|
-
</div>
|
|
2096
|
-
|
|
2097
|
-
<div data-bind="with: customSqlField, visible: formulaType()=='sql'">
|
|
2098
|
-
<div class="row">
|
|
2099
|
-
<div class="col-md-12">
|
|
2100
|
-
|
|
2101
|
-
<div class="mb-3">
|
|
2102
|
-
<label class="form-label">Select Data Operation:</label>
|
|
2103
|
-
<select class="form-select" data-bind="select2: {
|
|
2104
|
-
dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
|
|
2105
|
-
placeholder: 'Select Function...',
|
|
2106
|
-
data: availableFunctionsGrouped(),
|
|
2107
|
-
templateResult: templateResult
|
|
2108
|
-
}, value: selectedSqlFunction"></select>
|
|
2109
|
-
</div>
|
|
2110
|
-
|
|
2111
|
-
<div class="mb-3" data-bind="hidden: isConditionalFunction() || selectedSqlFunction() == 'Other'">
|
|
2112
|
-
<label class="form-label">Select the Data Field to use:</label>
|
|
2113
|
-
<select class="form-select"
|
|
2114
|
-
data-bind="select2: {
|
|
2115
|
-
dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
|
|
2116
|
-
placeholder: 'Search Field...',
|
|
2117
|
-
ajax: {
|
|
2118
|
-
url: $parent.textQuery.searchFields.url,
|
|
2119
|
-
dataType: 'json',
|
|
2120
|
-
data: $parent.textQuery.searchFields.query,
|
|
2121
|
-
processResults: $parent.textQuery.searchFields.processResults,
|
|
2122
|
-
headers: $parent.textQuery.searchFields.headers
|
|
2123
|
-
},
|
|
2124
|
-
minimumInputLength: 2,
|
|
2125
|
-
allowClear: true
|
|
2126
|
-
}, select2Text: selectedField,select2TableId:selectedFieldTableId"></select>
|
|
2127
|
-
<div data-bind="with: selectedField" class="small">
|
|
2128
|
-
Selected: <span class="highlight" data-bind="text: $data"></span>
|
|
2129
|
-
</div>
|
|
2130
|
-
</div>
|
|
2131
|
-
|
|
2132
|
-
<div class="mb-3" data-bind="if: requiresValue">
|
|
2133
|
-
<label for="inputValue" class="form-label">Provide the relevant value to use:</label>
|
|
2134
|
-
<input type="text" id="inputValue" class="form-control" data-bind="value: inputValue" required />
|
|
2135
|
-
</div>
|
|
2136
|
-
|
|
2137
|
-
<div class="mb-3" data-bind="visible: selectedSqlFunction() == 'Other'">
|
|
2138
|
-
<label for="custom-sql" class="form-label">Custom SQL Expression:</label>
|
|
2139
|
-
<p class="text-muted">
|
|
2140
|
-
Build your custom SQL Expression below by selecting data fields, adding calculations or using SQL keywords as needed. For string values, remember to enclose them in single quotes ('')
|
|
2141
|
-
</p>
|
|
2142
|
-
<p id="custom-sql" class="hint-input" contenteditable="true" placeholder="Write your custom SQL"></p>
|
|
2143
|
-
</div>
|
|
2144
|
-
<div data-bind="visible: isConditionalFunction">
|
|
2145
|
-
<p class="text-muted">
|
|
2146
|
-
Build your conditional logic below by selecting data fields, adding calculations and defining conditions as needed, and provide corresponding results. For string values, remember to enclose them in single quotes ('')
|
|
2147
|
-
</p>
|
|
2148
|
-
<div class="input-group mb-3">
|
|
2149
|
-
<div class="flex-grow-1">
|
|
2150
|
-
<p class="hint-input" id="condition-field" contenteditable="true" placeholder="Field to compare" title="Field to compare"></p>
|
|
2151
|
-
</div>
|
|
2152
|
-
|
|
2153
|
-
<div class="mx-2" style="width: 120px;">
|
|
2154
|
-
<select class="form-select form-select-sm" data-bind="options: availableOperators, value: selectedOperator"></select>
|
|
2155
|
-
</div>
|
|
2156
|
-
|
|
2157
|
-
<div class="flex-grow-1">
|
|
2158
|
-
<p class="hint-input" id="condition-value" contenteditable="true" placeholder="Value to compare" title="Value to compare"></p>
|
|
2159
|
-
</div>
|
|
2160
|
-
|
|
2161
|
-
<span class="input-group-text" style="max-height: 32px;">THEN</span>
|
|
2162
|
-
|
|
2163
|
-
<div class="flex-grow-1">
|
|
2164
|
-
<p class="hint-input" id="condition-result" contenteditable="true" placeholder="Condition Result" title="Condition Result"></p>
|
|
2165
|
-
</div>
|
|
2166
|
-
</div>
|
|
2167
|
-
|
|
2168
|
-
<button class="btn btn-outline-primary" data-bind="click: addCondition">Add Condition</button>
|
|
2169
|
-
<ul class="list-group mt-3" data-bind="foreach: conditions">
|
|
2170
|
-
<li class="list-group-item d-flex justify-content-between align-items-center">
|
|
2171
|
-
<span data-bind="text: conditionDisplay"></span>
|
|
2172
|
-
<button class="btn btn-sm btn-danger" data-bind="click: $parent.removeCondition">Remove</button>
|
|
2173
|
-
</li>
|
|
2174
|
-
</ul>
|
|
2175
|
-
|
|
2176
|
-
<div class="input-group mb-3" style="padding-top: 5px;">
|
|
2177
|
-
<span class="input-group-text" style="max-height: 32px;">ELSE</span>
|
|
2178
|
-
<div class="flex-grow-1">
|
|
2179
|
-
<p class="hint-input" id="condition-else" contenteditable="true" placeholder="Default Result" title="Default Result"></p>
|
|
2180
|
-
</div>
|
|
2181
|
-
</div>
|
|
2182
|
-
</div>
|
|
2183
|
-
|
|
2184
|
-
</div>
|
|
2185
|
-
</div>
|
|
2186
|
-
</div>
|
|
2187
|
-
|
|
2188
|
-
<div class="col-md-12">
|
|
2189
|
-
<hr />
|
|
2190
|
-
<a href="#" class="btn btn-primary btn-sm" title="Save Custom Formula Field" data-bind="click: saveFormulaField, visible: isFormulaField">Save</a>
|
|
2191
|
-
<a href="#" class="btn btn-sm" title="Custom Field using Formula" data-bind="click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Customize', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
|
|
2192
|
-
</div>
|
|
2193
|
-
</div>
|
|
2194
|
-
</script>
|
|
2195
|
-
|
|
2196
|
-
<script type="text/html" id="report-designer-compact">
|
|
2197
|
-
<div class="designer-container compact-designer" id="choose-data-design" style="font-size:12px;">
|
|
2198
|
-
|
|
2199
|
-
<!-- Visualization Toolbar -->
|
|
2200
|
-
<div class="card p-1 mb-2">
|
|
2201
|
-
<div class="card-header p-1 d-flex justify-content-between align-items-center">
|
|
2202
|
-
<span><i class="fa fa-file"></i> Visualization</span>
|
|
2203
|
-
<button type="button" class="btn btn-sm btn-light" data-bind="visible: ReportID(), click: function() {activeDesign(false);}" title="Close">
|
|
2204
|
-
<i class="fa fa-times"></i> Close Designer
|
|
2205
|
-
</button>
|
|
2206
|
-
</div>
|
|
2207
|
-
<div class="card-body p-1">
|
|
2208
|
-
<div data-bind="template: 'designer-choose-visual'"></div>
|
|
2209
|
-
</div>
|
|
2210
|
-
</div>
|
|
2211
|
-
|
|
2212
|
-
<!-- Main Grid -->
|
|
2213
|
-
<div class="d-flex flex-row flex-wrap gap-2 compact-filters needs-validation">
|
|
2214
|
-
|
|
2215
|
-
<!-- Data -->
|
|
2216
|
-
<div class="card flex-fill expandable-panel" id="dataPanel" style="max-width: 300px"
|
|
2217
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('dataPanel')}">
|
|
2218
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('dataPanel')}">
|
|
2219
|
-
<i class="fa fa-database"></i> Data
|
|
2220
|
-
</div>
|
|
2221
|
-
|
|
2222
|
-
<div class="card-body p-1">
|
|
2223
|
-
<div data-bind="template: 'designer-choose-data'"></div>
|
|
2224
|
-
</div>
|
|
2225
|
-
</div>
|
|
2226
|
-
|
|
2227
|
-
<!-- Selected -->
|
|
2228
|
-
<div class="card flex-fill expandable-panel" id="selectedPanel" style="max-width: 400px"
|
|
2229
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('selectedPanel')}">
|
|
2230
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('selectedPanel')}">
|
|
2231
|
-
<i class="fa fa-table"></i> Selected data for the Report
|
|
2232
|
-
<a href="#" class="small text-muted float-end"
|
|
2233
|
-
data-bind="visible: SelectedFields().length, click:function(){SelectedFields([]);}">Clear all</a>
|
|
2234
|
-
</div>
|
|
2235
|
-
|
|
2236
|
-
<div class="card-body designer-auto-update p-1">
|
|
2237
|
-
<div style="max-height: 300px; overflow-y: auto;">
|
|
2238
|
-
<div data-bind="template: 'designer-selected-data'"></div>
|
|
2239
|
-
</div>
|
|
2240
|
-
</div>
|
|
2241
|
-
</div>
|
|
2242
|
-
|
|
2243
|
-
<div class="card flex-fill expandable-panel" id="subReportsPanel"
|
|
2244
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('subReportsPanel')}, visible: linkedReportFields().length > 0">
|
|
2245
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('subReportsPanel')}">
|
|
2246
|
-
<i class="fa fa-bookmark"></i> Sub Reports
|
|
2247
|
-
</div>
|
|
2248
|
-
<div class="card-body p-1">
|
|
2249
|
-
<div data-bind="template: 'designer-sub-report', data: $data"></div>
|
|
2250
|
-
</div>
|
|
2251
|
-
</div>
|
|
2252
|
-
|
|
2253
|
-
<div class="card flex-fill expandable-panel" id="htmlReportPanel"
|
|
2254
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('htmlReportPanel')}, visible: ReportType()=='Html'">
|
|
2255
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('htmlReportPanel')}">
|
|
2256
|
-
<i class="fa fa-pencil"></i> Custom Design
|
|
2257
|
-
</div>
|
|
2258
|
-
<div class="card-body p-1">
|
|
2259
|
-
<div data-bind="template: 'designer-html', data: $data"></div>
|
|
2260
|
-
</div>
|
|
2261
|
-
</div>
|
|
2262
|
-
|
|
2263
|
-
<!-- Custom Field -->
|
|
2264
|
-
<div class="card flex-fill expandable-panel" id="customFieldPanel" data-bind="visible: isFormulaField">
|
|
2265
|
-
<div class="card-header p-1">
|
|
2266
|
-
<i class="fa fa-magic"></i> Custom Field
|
|
2267
|
-
</div>
|
|
2268
|
-
<div class="card-body p-1 custom-field-design" style="max-height: 400px; overflow-y: auto; overflow-x: hidden;">
|
|
2269
|
-
<div data-bind="template: 'custom-field-designer', data: $data"></div>
|
|
2270
|
-
</div>
|
|
2271
|
-
</div>
|
|
2272
|
-
<!-- Field Options Panel -->
|
|
2273
|
-
<div id="fieldOptionsPanel" class="card p-2 mt-2 collapse">
|
|
2274
|
-
<!-- dynamic field settings load here -->
|
|
2275
|
-
</div>
|
|
2276
|
-
<!-- Filters -->
|
|
2277
|
-
<div class="card flex-fill expandable-panel" id="filtersPanel"
|
|
2278
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('filtersPanel')}, hidden: isFormulaField">
|
|
2279
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('filtersPanel')}">
|
|
2280
|
-
<i class="fa fa-filter"></i> Filters
|
|
2281
|
-
</div>
|
|
2282
|
-
<div class="card-body p-1 designer-auto-update" style="max-height:300px; overflow-y:auto;">
|
|
2283
|
-
<div data-bind="if:useStoredProc"><div data-bind="template:{name:'filter-parameters'}"></div></div>
|
|
2284
|
-
<div data-bind="ifnot:useStoredProc"><div data-bind="template:{name:'filter-group'}"></div></div>
|
|
2285
|
-
</div>
|
|
2286
|
-
</div>
|
|
2287
|
-
|
|
2288
|
-
<!-- Sort -->
|
|
2289
|
-
<div class="card flex-fill expandable-panel" id="sortPanel"
|
|
2290
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('sortPanel')}, hidden: useStoredProc() || isFormulaField()">
|
|
2291
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('sortPanel')}">
|
|
2292
|
-
<i class="fa fa-sort"></i> Sort
|
|
2293
|
-
</div>
|
|
2294
|
-
<div class="card-body p-1 designer-auto-update row">
|
|
2295
|
-
<div data-bind="template: 'designer-sort'"></div>
|
|
2296
|
-
</div>
|
|
2297
|
-
</div>
|
|
2298
|
-
|
|
2299
|
-
<!-- Settings -->
|
|
2300
|
-
<div class="card flex-fill expandable-panel" id="settingsPanel"
|
|
2301
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('settingsPanel')}, hidden: isFormulaField">
|
|
2302
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('settingsPanel')}">
|
|
2303
|
-
<i class="fa fa-gear"></i>Options
|
|
2304
|
-
</div>
|
|
2305
|
-
<div class="card-body">
|
|
2306
|
-
<div class="form-group row">
|
|
2307
|
-
<label class="col-form-label h6">
|
|
2308
|
-
<i class="fa fa-file"></i> Report Name
|
|
2309
|
-
</label>
|
|
2310
|
-
<div>
|
|
2311
|
-
<input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
|
|
2312
|
-
</div>
|
|
2313
|
-
</div>
|
|
2314
|
-
<div class="form-group row">
|
|
2315
|
-
<label class="control-label h6">
|
|
2316
|
-
<i class="fa fa-info-circle"></i> Report Description
|
|
2317
|
-
</label>
|
|
2318
|
-
<div>
|
|
2319
|
-
<textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
|
|
2320
|
-
</div>
|
|
2321
|
-
</div>
|
|
2322
|
-
<div class="checkbox" data-bind="visible: CanSaveReports()">
|
|
2323
|
-
<label>
|
|
2324
|
-
<input type="checkbox" data-bind="checked: SaveReport">
|
|
2325
|
-
Save Report
|
|
2326
|
-
</label>
|
|
2327
|
-
</div>
|
|
2328
|
-
<div class="form-group row" data-bind="visible: SaveReport">
|
|
2329
|
-
<label class="control-label h6">
|
|
2330
|
-
<i class="fa fa-folder-open"></i> Choose Folder
|
|
2331
|
-
</label>
|
|
2332
|
-
<div>
|
|
2333
|
-
<select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
|
|
2334
|
-
</div>
|
|
2335
|
-
</div>
|
|
2336
|
-
<hr />
|
|
2337
|
-
<div data-bind="template: 'designer-options'"></div>
|
|
2338
|
-
</div>
|
|
2339
|
-
</div>
|
|
2340
|
-
|
|
2341
|
-
<!-- Schedule -->
|
|
2342
|
-
<div class="card flex-fill expandable-panel" id="schedulePanel"
|
|
2343
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('schedulePanel')}">
|
|
2344
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('schedulePanel')}">
|
|
2345
|
-
<i class="fa fa-hourglass"></i> Schedule
|
|
2346
|
-
</div>
|
|
2347
|
-
<div class="card-body p-1 designer-auto-update row">
|
|
2348
|
-
<div data-bind="template: {name: 'report-schedule'}"></div>
|
|
2349
|
-
</div>
|
|
2350
|
-
</div>
|
|
2351
|
-
|
|
2352
|
-
<!-- Access -->
|
|
2353
|
-
<div class="card flex-fill expandable-panel" id="accessPanel"
|
|
2354
|
-
data-bind="css:{'collapsed-vertical': panels.isCollapsed('accessPanel')}, visible: adminMode() && !isFormulaField()">
|
|
2355
|
-
<div class="card-header p-1" data-bind="click:function(){panels.togglePanel('accessPanel')}">
|
|
2356
|
-
<i class="fa fa-key"></i>Security
|
|
2357
|
-
</div>
|
|
2358
|
-
|
|
2359
|
-
<div data-bind="" class="card card-body">
|
|
2360
|
-
<div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
|
|
2361
|
-
</div>
|
|
2362
|
-
</div>
|
|
2363
|
-
|
|
2364
|
-
</div>
|
|
2365
|
-
</div>
|
|
2366
|
-
<hr />
|
|
2367
|
-
</script>
|
|
2368
|
-
|
|
2369
|
-
<script type="text/html" id="report-designer">
|
|
2370
|
-
<div class="modal-dialog modal-dialog-scrollable" style="height: 100vh;" id="report-designer-modal">
|
|
2371
|
-
<div class="modal-content" style="display: flex; flex-direction: column; height: 100%;">
|
|
2372
|
-
<div class="modal-header">
|
|
2373
|
-
<h5 class="modal-title" id="myModalLabel">
|
|
2374
|
-
<a title="Need help setting up a report?" target="_blank" href="https://dotnetreport.com/blogs/docs/designing-reports"><span class="fa fa-question-circle"></span></a> Design your Report
|
|
2375
|
-
</h5>
|
|
2376
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" data-bind="click: onModalCloseClicked" aria-label="Close"></button>
|
|
2377
|
-
</div>
|
|
2378
|
-
<div class="modal-body needs-validation" style="overflow-y: auto; flex-grow: 1;">
|
|
2379
|
-
<div class="row">
|
|
2380
|
-
<div class="col-md-4">
|
|
2381
|
-
<div class="card card-body" id="choose-data-card" style="min-height: calc(100vh - 200px);">
|
|
2382
|
-
<div class="form-group row align-items-center">
|
|
2383
|
-
<label class="col-sm-4 col-form-label h6">
|
|
2384
|
-
<i class="fa fa-file"></i> Report Name
|
|
2385
|
-
</label>
|
|
2386
|
-
<div class="col-sm-8">
|
|
2387
|
-
<input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
|
|
2388
|
-
</div>
|
|
2389
|
-
</div>
|
|
2390
|
-
<hr />
|
|
2391
|
-
<h5><span class="fa fa-database"></span> Choose Data for Report</h5>
|
|
2392
|
-
<div data-bind="template: 'designer-choose-data'"></div>
|
|
2393
|
-
</div>
|
|
2394
|
-
<br />
|
|
2395
|
-
|
|
2396
|
-
<div class="card card-body">
|
|
2397
|
-
|
|
2398
|
-
<div class="form-group row">
|
|
2399
|
-
<label class="control-label h6">
|
|
2400
|
-
<i class="fa fa-info-circle"></i> Report Description
|
|
2401
|
-
</label>
|
|
2402
|
-
<div>
|
|
2403
|
-
<textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
|
|
2404
|
-
</div>
|
|
2405
|
-
</div>
|
|
2406
|
-
<div class="checkbox" data-bind="visible: CanSaveReports()">
|
|
2407
|
-
<label>
|
|
2408
|
-
<input type="checkbox" data-bind="checked: SaveReport">
|
|
2409
|
-
Save Report
|
|
2410
|
-
</label>
|
|
2411
|
-
</div>
|
|
2412
|
-
<div class="form-group row" data-bind="visible: SaveReport">
|
|
2413
|
-
<label class="control-label h6">
|
|
2414
|
-
<i class="fa fa-folder-open"></i> Choose Folder
|
|
2415
|
-
</label>
|
|
2416
|
-
<div>
|
|
2417
|
-
<select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
|
|
2418
|
-
</div>
|
|
2419
|
-
</div>
|
|
2420
|
-
</div>
|
|
2421
|
-
</div>
|
|
2422
|
-
<div class="col-md-8">
|
|
2423
|
-
<div class="card card-body">
|
|
2424
|
-
<h5><span class="fa fa-file"></span> Choose Visualization</h5>
|
|
2425
|
-
<div style="overflow-x: auto; white-space: nowrap;">
|
|
2426
|
-
<div data-bind="template: 'designer-choose-visual'"></div>
|
|
2427
|
-
</div>
|
|
2428
|
-
</div>
|
|
2429
|
-
<div>
|
|
2430
|
-
<div data-bind="if: isFunctionField" class="custom-field-design">
|
|
2431
|
-
<br />
|
|
2432
|
-
<br />
|
|
2433
|
-
<div class="card">
|
|
2434
|
-
<div class="card-body">
|
|
2435
|
-
<div class="row">
|
|
2436
|
-
<div class="col-md-12 pull-right">
|
|
2437
|
-
<a href="#" class="btn btn-primary btn-sm" title="Save Custom Function Field" data-bind="click: saveFunctionField, visible: isFunctionField">Save</a>
|
|
2438
|
-
<a href="#" class="btn btn-sm" title="Custom Field using Function" data-bind="click: function(){isFunctionField(!isFunctionField())}, text: isFunctionField()? 'Cancel': 'Function', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
|
|
2439
|
-
</div>
|
|
2440
|
-
<div class="col-md-12 padded-div" data-bind="visible: isFunctionField()">
|
|
2441
|
-
<div class="alert alert-info">
|
|
2442
|
-
You are now creating a Customized Field using Functions available.
|
|
2443
|
-
</div>
|
|
2444
|
-
</div>
|
|
2445
|
-
</div>
|
|
2446
|
-
|
|
2447
|
-
<div class="form-group row">
|
|
2448
|
-
<label class="col-sm-2 control-label">Field Label</label>
|
|
2449
|
-
<div class="col-sm-10">
|
|
2450
|
-
<input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
|
|
2451
|
-
</div>
|
|
2452
|
-
</div>
|
|
2453
|
-
<div class="form-group row">
|
|
2454
|
-
<label class="col-sm-2 control-label">Data Format</label>
|
|
2455
|
-
<div class="col-sm-10">
|
|
2456
|
-
<select class="form-select form-control-sm" data-bind="value: formulaDataFormat" required>
|
|
2457
|
-
<option>String</option>
|
|
2458
|
-
<option>Integer</option>
|
|
2459
|
-
<option>Decimal</option>
|
|
2460
|
-
<option>Currency</option>
|
|
2461
|
-
<option>Date</option>
|
|
2462
|
-
<option value="DateTime">Date and Time</option>
|
|
2463
|
-
</select>
|
|
2464
|
-
</div>
|
|
2465
|
-
</div>
|
|
2466
|
-
<div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
|
|
2467
|
-
<label class="col-sm-2 control-label">Round to Decimal Places</label>
|
|
2468
|
-
<div class="col-sm-10">
|
|
2469
|
-
<input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
|
|
2470
|
-
</div>
|
|
2471
|
-
</div>
|
|
2472
|
-
|
|
2473
|
-
<div>
|
|
2474
|
-
Define your Function:
|
|
2475
|
-
<textarea id="function-code"></textarea>
|
|
2476
|
-
</div>
|
|
2477
|
-
</div>
|
|
2478
|
-
</div>
|
|
2479
|
-
<div class="clearfix"></div>
|
|
2480
|
-
</div>
|
|
2481
|
-
|
|
2482
|
-
<div data-bind="if: lastPickedField() && lastPickedField().fieldType == 'Json'">
|
|
2483
|
-
<br />
|
|
2484
|
-
<div class="card">
|
|
2485
|
-
<div class="card-header">
|
|
2486
|
-
<h6>Select Data Fields from <span data-bind="text: lastPickedField().fieldName"></span></h6>
|
|
2487
|
-
</div>
|
|
2488
|
-
<div class="card-body">
|
|
2489
|
-
<div class="row container-fluid" data-bind="foreach: jsonFields">
|
|
2490
|
-
<div class="col-md-3 col-sm-4 col-xs-6 list-group">
|
|
2491
|
-
<div class="list-group-item">
|
|
2492
|
-
<div class="checkbox">
|
|
2493
|
-
<label>
|
|
2494
|
-
<input type="checkbox" data-bind="checkedInArray: {array: $parent.SelectedFields, value: $data}">
|
|
2495
|
-
<span data-bind="text: jsonColumnName"></span>
|
|
2496
|
-
</label>
|
|
2497
|
-
</div>
|
|
2498
|
-
</div>
|
|
2499
|
-
</div>
|
|
2500
|
-
</div>
|
|
2501
|
-
</div>
|
|
2502
|
-
</div>
|
|
2503
|
-
</div>
|
|
2504
|
-
|
|
2505
|
-
<div id="customFieldSection" data-bind="if: isFormulaField" class="custom-field-design">
|
|
2506
|
-
<br />
|
|
2507
|
-
<br />
|
|
2508
|
-
<div class="card">
|
|
2509
|
-
<div class="card-header">
|
|
2510
|
-
<b>Build Custom Field</b>
|
|
2511
|
-
</div>
|
|
2512
|
-
<div class="card-body" data-bind="template: 'custom-field-designer'">
|
|
2513
|
-
|
|
2514
|
-
</div>
|
|
2515
|
-
</div>
|
|
2516
|
-
<div class="clearfix"></div>
|
|
2517
|
-
</div>
|
|
2518
|
-
</div>
|
|
2519
|
-
<br />
|
|
2520
|
-
<div class="card card-body">
|
|
2521
|
-
<div class="row">
|
|
2522
|
-
<h5 class="col-8 pull-left"><span class="fa fa-table"></span> Selected data for the Report</h5>
|
|
2523
|
-
<div class="col-4 pull-right right-align">
|
|
2524
|
-
<a href="#" class="small text-muted" data-bind="visible: SelectedFields().length, click: function() {SelectedFields([]);}">Clear all</a>
|
|
2525
|
-
</div>
|
|
2526
|
-
</div>
|
|
2527
|
-
|
|
2528
|
-
<div data-bind="template: 'designer-selected-data'"></div>
|
|
2529
|
-
</div>
|
|
2530
|
-
<div data-bind="if: linkedReportFields().length > 0">
|
|
2531
|
-
<br />
|
|
2532
|
-
<div class="card mb-4">
|
|
2533
|
-
<div class="card-header bg-light">
|
|
2534
|
-
<h5 class="mb-0">
|
|
2535
|
-
<i class="fa fa-bookmark"></i> Include Sub Reports
|
|
2536
|
-
</h5>
|
|
2537
|
-
</div>
|
|
2538
|
-
<div class="card-body">
|
|
2539
|
-
<div data-bind="template: 'designer-sub-report'"></div>
|
|
2540
|
-
</div>
|
|
2541
|
-
</div>
|
|
2542
|
-
</div>
|
|
2543
|
-
<div data-bind="visible: ReportType()=='Html'">
|
|
2544
|
-
<br />
|
|
2545
|
-
<div class="card mb-4">
|
|
2546
|
-
<div class="card-header bg-light">
|
|
2547
|
-
<h5 class="mb-0">
|
|
2548
|
-
<i class="fa fa-pencil"></i> Design your Report
|
|
2549
|
-
</h5>
|
|
2550
|
-
</div>
|
|
2551
|
-
<div class="card-body">
|
|
2552
|
-
<div data-bind="template: 'designer-html'"></div>
|
|
2553
|
-
</div>
|
|
2554
|
-
</div>
|
|
2555
|
-
</div>
|
|
2556
|
-
<br />
|
|
2557
|
-
<div class="card card-body">
|
|
2558
|
-
<h5><span class="fa fa-filter"></span> Choose Filters</h5>
|
|
2559
|
-
|
|
2560
|
-
<div class="row" style="padding: 10px 10px; overflow-x: auto;">
|
|
2561
|
-
<div data-bind="if: useStoredProc" class="col-md-12">
|
|
2562
|
-
<div data-bind="template: {name: 'filter-parameters'}"></div>
|
|
2563
|
-
</div>
|
|
2564
|
-
<div data-bind="ifnot: useStoredProc" class="col-md-12">
|
|
2565
|
-
<div data-bind="template: {name: 'filter-group'}"></div>
|
|
2566
|
-
</div>
|
|
2567
|
-
|
|
2568
|
-
<div class="checkbox col-12">
|
|
2569
|
-
<label>
|
|
2570
|
-
<input type="checkbox" data-bind="checked: EditFiltersOnReport" />
|
|
2571
|
-
Allow setting up and saving filters on Report
|
|
2572
|
-
</label>
|
|
2573
|
-
</div>
|
|
2574
|
-
<br />
|
|
2575
|
-
</div>
|
|
2576
|
-
</div>
|
|
2577
|
-
<br />
|
|
2578
|
-
<div data-bind="hidden: useStoredProc" class="card card-body">
|
|
2579
|
-
<h5><span class="fa fa-sort"></span> Choose Sorting</h5>
|
|
2580
|
-
<div data-bind="template: 'designer-sort'"></div>
|
|
2581
|
-
</div>
|
|
2582
|
-
<br />
|
|
2583
|
-
<div data-bind="visible: SaveReport" class="card card-body">
|
|
2584
|
-
<h5><span class="fa fa-hourglass"></span> Choose Schedule</h5>
|
|
2585
|
-
|
|
2586
|
-
<div style="padding: 10px 10px" data-bind="if: SaveReport">
|
|
2587
|
-
<div data-bind="template: {name: 'report-schedule'}"></div>
|
|
2588
|
-
</div>
|
|
2589
|
-
</div>
|
|
2590
|
-
<br />
|
|
2591
|
-
<div data-bind="ifnot: useStoredProc">
|
|
2592
|
-
<div class="card card-body">
|
|
2593
|
-
<div data-bind="template: 'designer-options'"></div>
|
|
2594
|
-
</div>
|
|
2595
|
-
</div>
|
|
2596
|
-
<br />
|
|
2597
|
-
<div data-bind="visible: adminMode" class="card card-body">
|
|
2598
|
-
<div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
|
|
2599
|
-
</div>
|
|
2600
|
-
|
|
2601
|
-
</div>
|
|
2602
|
-
</div>
|
|
2603
|
-
</div>
|
|
2604
|
-
<div class="modal-footer">
|
|
2605
|
-
<button class="btn btn-primary" data-bind="visible: adminMode, click: RunReportSqlPreview">
|
|
2606
|
-
<i class="fa fa-code"></i> Preview Report Code
|
|
2607
|
-
</button>
|
|
2608
|
-
<a href="#" class="btn btn-danger" data-bind="click: cancelCreateReport">Cancel editing Report</a>
|
|
2609
|
-
<button class="btn btn-primary" type="button" data-bind="visible: SaveReport() && CanSaveReports(), click: SaveWithoutRun" style="padding-right: 10px;">Save Report</button>
|
|
2610
|
-
<button class="btn btn-primary" type="button" data-bind="text: SaveReport() && CanSaveReports()? 'Save & Run Report': 'Run Report', click: RunReport">Run Report</button>
|
|
2611
|
-
</div>
|
|
2612
|
-
|
|
2613
|
-
</div>
|
|
2614
|
-
</div>
|
|
2615
|
-
</script>
|
|
2616
|
-
|
|
2617
|
-
<script type="text/html" id="chart-settings">
|
|
2618
|
-
<div class="chart-container pull-right">
|
|
2619
|
-
<button class="btn btn-light btn-sm d-flex align-items-center mt-2 chart-settings-btn"
|
|
2620
|
-
data-bind="click: toggleChartSettings" title="Report settings">
|
|
2621
|
-
<i class="fa fa-cog"></i>
|
|
2622
|
-
</button>
|
|
2623
|
-
|
|
2624
|
-
<div class="chart-settings-panel border p-2 shadow-sm bg-light" data-bind="visible: showSettings">
|
|
2625
|
-
<div class="d-flex justify-content-between align-items-center mb-2">
|
|
2626
|
-
<button class="btn btn-sm btn-close" data-bind="click: toggleChartSettings"></button>
|
|
2627
|
-
<h6 class="mb-0">Report Settings</h6>
|
|
2628
|
-
</div>
|
|
2629
|
-
<ul class="nav nav-tabs nav-sm mb-2 small" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
|
|
2630
|
-
<li class="nav-item">
|
|
2631
|
-
<a class="nav-link"
|
|
2632
|
-
data-bs-toggle="tab"
|
|
2633
|
-
data-bind="attr: { href: '#chartTab-' + ReportID() }, css: { active: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
|
|
2634
|
-
Chart
|
|
2635
|
-
</a>
|
|
2636
|
-
</li>
|
|
2637
|
-
<li class="nav-item">
|
|
2638
|
-
<a class="nav-link"
|
|
2639
|
-
data-bs-toggle="tab"
|
|
2640
|
-
data-bind="attr: { href: '#tableTab-' + ReportID() }, css: { active: !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
|
|
2641
|
-
Table
|
|
2642
|
-
</a>
|
|
2643
|
-
</li>
|
|
2644
|
-
</ul>
|
|
2645
|
-
<div class="tab-content small">
|
|
2646
|
-
<div class="tab-pane fade"
|
|
2647
|
-
data-bind="attr: { id: 'chartTab-' + ReportID() }, css: { 'show active': ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
|
|
2648
|
-
<div class="mb-2">
|
|
2649
|
-
<div class="btn-group" role="group" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
|
|
2650
|
-
<button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Bar Chart"
|
|
2651
|
-
data-bind="css: { 'active': ReportType() === 'Bar' }, click: function() { ReportType('Bar'); }">
|
|
2652
|
-
<span class="fa fa-bar-chart"></span>
|
|
2653
|
-
</button>
|
|
2654
|
-
<button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Pie Chart"
|
|
2655
|
-
data-bind="css: { 'active': ReportType() === 'Pie' }, click: function() { ReportType('Pie'); }">
|
|
2656
|
-
<span class="fa fa-pie-chart"></span>
|
|
2657
|
-
</button>
|
|
2658
|
-
<button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Line Chart"
|
|
2659
|
-
data-bind="css: { 'active': ReportType() === 'Line' }, click: function() { ReportType('Line'); }">
|
|
2660
|
-
<span class="fa fa-line-chart"></span>
|
|
2661
|
-
</button>
|
|
2662
|
-
</div>
|
|
2663
|
-
</div>
|
|
2664
|
-
<div data-bind="visible: ReportType()=='Bar'">
|
|
2665
|
-
<div class="form-group row">
|
|
2666
|
-
<div class="checkbox col-6">
|
|
2667
|
-
<label><input type="checkbox" data-bind="checked: barChartHorizontal" /> Horizontal</label>
|
|
2668
|
-
</div>
|
|
2669
|
-
<div class="checkbox col-6">
|
|
2670
|
-
<label><input type="checkbox" data-bind="checked: barChartStacked" /> Stacked</label>
|
|
2671
|
-
</div>
|
|
2672
|
-
</div>
|
|
2673
|
-
</div>
|
|
2674
|
-
<div data-bind="visible: ReportType()=='Pie'">
|
|
2675
|
-
<div class="form-group row">
|
|
2676
|
-
<div class="checkbox col-6">
|
|
2677
|
-
<label><input type="checkbox" data-bind="checked: pieChartDonut" /> Donut</label>
|
|
2678
|
-
</div>
|
|
2679
|
-
</div>
|
|
2680
|
-
</div>
|
|
2681
|
-
<div data-bind="visible: ReportType()=='Line'">
|
|
2682
|
-
<div class="form-group row">
|
|
2683
|
-
<div class="checkbox col-6">
|
|
2684
|
-
<label><input type="checkbox" data-bind="checked: lineChartArea" /> Area</label>
|
|
2685
|
-
</div>
|
|
2686
|
-
</div>
|
|
2687
|
-
</div>
|
|
2688
|
-
<div class="mb-2">
|
|
2689
|
-
<label class="form-label small">Background Color</label>
|
|
2690
|
-
<div class="d-flex align-items-center flex-wrap">
|
|
2691
|
-
<input type="color" class="color-picker" data-bind="value: chartOptions().backgroundColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
|
|
2692
|
-
</div>
|
|
2693
|
-
</div>
|
|
2694
|
-
<div class="mb-2">
|
|
2695
|
-
<label class="form-label small">Font Color</label>
|
|
2696
|
-
<div class="d-flex align-items-center flex-wrap">
|
|
2697
|
-
<input type="color" class="color-picker" data-bind="value: chartOptions().fontColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
|
|
2698
|
-
</div>
|
|
2699
|
-
</div>
|
|
2700
|
-
<div class="mb-2">
|
|
2701
|
-
<label class="form-label small">Series Colors</label>
|
|
2702
|
-
<div class="d-flex flex-wrap" data-bind="foreach: chartOptions().seriesColors">
|
|
2703
|
-
<div class="color-box me-2">
|
|
2704
|
-
<input type="color" class="color-picker"
|
|
2705
|
-
data-bind="value: $data, event: { input: function(data, event) { $parent.updateSeriesColor($index(), event.target.value); } }">
|
|
2706
|
-
<button class="btn btn-sm btn-danger remove-color" data-bind="click: $parent.removeSeriesColor">×</button>
|
|
2707
|
-
</div>
|
|
2708
|
-
</div>
|
|
2709
|
-
<button class="color-box btn btn-sm btn-secondary" data-bind="click: addSeriesColor" title="Add Series Color" style="margin-top: -7px;">
|
|
2710
|
-
<i class="fa fa-plus"></i>
|
|
2711
|
-
</button>
|
|
2712
|
-
</div>
|
|
2713
|
-
<div class="d-flex justify-content-between mb-1">
|
|
2714
|
-
<div>
|
|
2715
|
-
<label class="form-label small">Legend Position</label>
|
|
2716
|
-
<select class="form-select form-select-sm" data-bind="value: chartOptions().legendPosition, event: { change: updateChart }">
|
|
2717
|
-
<option value="right">Right</option>
|
|
2718
|
-
<option value="top">Top</option>
|
|
2719
|
-
<option value="bottom">Bottom</option>
|
|
2720
|
-
<option value="none">None</option>
|
|
2721
|
-
</select>
|
|
2722
|
-
</div>
|
|
2723
|
-
<div>
|
|
2724
|
-
<label class="form-label small">Font Size</label>
|
|
2725
|
-
<input type="number" class="form-control form-control-sm font-size-input" data-bind="value: chartOptions().fontSize, event: { change: updateChart }">
|
|
2726
|
-
</div>
|
|
2727
|
-
</div>
|
|
2728
|
-
<div data-bind="visible: ReportType()!='Pie'">
|
|
2729
|
-
<div class="form-check form-switch small mb-1">
|
|
2730
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showXAxisLabel, event: { change: updateChart }">
|
|
2731
|
-
<label class="form-check-label">X-Axis Label</label>
|
|
2732
|
-
</div>
|
|
2733
|
-
<div class="form-check form-switch small mb-1">
|
|
2734
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showYAxisLabel, event: { change: updateChart }">
|
|
2735
|
-
<label class="form-check-label">Y-Axis Label</label>
|
|
2736
|
-
</div>
|
|
2737
|
-
<div class="form-check form-switch small mb-1" data-bind="visible: ReportType() !== 'Pie'">
|
|
2738
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showGridlines, event: { change: updateChart }">
|
|
2739
|
-
<label class="form-check-label">Gridlines</label>
|
|
2740
|
-
</div>
|
|
2741
|
-
<div class="form-check form-switch small mb-1">
|
|
2742
|
-
<input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showSmallValuesOnLabel, event: { change: updateChart }">
|
|
2743
|
-
<label class="form-check-label">Show Small Values On Label</label>
|
|
2744
|
-
</div>
|
|
2745
|
-
<div class="form-group small mb-1">
|
|
2746
|
-
<label class="form-label">Y-Axis Format</label>
|
|
2747
|
-
<input type="text" class="form-control form-control-sm" placeholder="#,##0.00" data-bind="value: chartOptions().yAxisFormat, event: { change: updateChart }" />
|
|
2748
|
-
</div>
|
|
2749
|
-
<div class="form-group small mb-1 d-flex gap-2">
|
|
2750
|
-
<div class="w-50">
|
|
2751
|
-
<label class="form-label">Y-Axis Min</label>
|
|
2752
|
-
<input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMin, event: { change: updateChart }" />
|
|
2753
|
-
</div>
|
|
2754
|
-
<div class="w-50">
|
|
2755
|
-
<label class="form-label">Y-Axis Max</label>
|
|
2756
|
-
<input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMax, event: { change: updateChart }" />
|
|
2757
|
-
</div>
|
|
2758
|
-
</div>
|
|
2759
|
-
</div>
|
|
2760
|
-
</div>
|
|
2761
|
-
|
|
2762
|
-
<div class="tab-pane fade"
|
|
2763
|
-
data-bind="attr: { id: 'tableTab-' + ReportID() }, css: { 'show active': !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
|
|
2764
|
-
<div class="form-group row">
|
|
2765
|
-
<div class="mb-2 col-6">
|
|
2766
|
-
<label class="form-label small">Header Back Color</label><br />
|
|
2767
|
-
<input type="color" class="color-picker"
|
|
2768
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} , value: tableSettings().headerBackColor, event: { change: updateTable }"/>
|
|
2769
|
-
</div>
|
|
2770
|
-
<div class="mb-2 col-6">
|
|
2771
|
-
<label class="form-label small">Header Font Color</label><br />
|
|
2772
|
-
<input type="color" class="color-picker"
|
|
2773
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().headerFontColor, event: { change: updateTable }"/>
|
|
2774
|
-
</div>
|
|
2775
|
-
</div>
|
|
2776
|
-
<div class="form-group row">
|
|
2777
|
-
<div class="mb-2 col-6">
|
|
2778
|
-
<label class="form-label small">Row Back Color</label><br />
|
|
2779
|
-
<input type="color" class="color-picker"
|
|
2780
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowBackColor, event: { change: updateTable }"/>
|
|
2781
|
-
</div>
|
|
2782
|
-
<div class="mb-2 col-6">
|
|
2783
|
-
<label class="form-label small">Row Font Color</label><br />
|
|
2784
|
-
<input type="color" class="color-picker"
|
|
2785
|
-
data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowFontColor, event: { change: updateTable }"/>
|
|
2786
|
-
</div>
|
|
2787
|
-
</div>
|
|
2788
|
-
<div class="form-group row" style="display: none;">
|
|
2789
|
-
<div class="mb-2 col-6">
|
|
2790
|
-
<label class="form-label small">Alt Row Back Color</label><br />
|
|
2791
|
-
<input type="color" class="color-picker"
|
|
2792
|
-
data-bind="value: tableSettings().altRowBackColor, event: { change: updateTable }"/>
|
|
2793
|
-
</div>
|
|
2794
|
-
<div class="mb-2 col-6">
|
|
2795
|
-
<label class="form-label small">Alt Row Font Color</label>
|
|
2796
|
-
<input type="color" class="color-picker"
|
|
2797
|
-
data-bind="value: tableSettings().altRowFontColor, event: { change: updateTable }"/>
|
|
2798
|
-
</div>
|
|
2799
|
-
</div>
|
|
2800
|
-
<div class="form-group mb-2" style="display: none;">
|
|
2801
|
-
<label class="form-label small">Borders</label>
|
|
2802
|
-
<div class="btn-group d-flex flex-wrap">
|
|
2803
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2804
|
-
data-bind="click: function(){ tableSettings().border('none'); updateTable(); }, css: { active: tableSettings().border === 'none' }">None</button>
|
|
2805
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2806
|
-
data-bind="click: function(){ tableSettings().border('all'); updateTable(); }, css: { active: tableSettings().border === 'all' }">All</button>
|
|
2807
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2808
|
-
data-bind="click: function(){ tableSettings().border('outer'); updateTable(); }, css: { active: tableSettings().border === 'outer' }">Outside</button>
|
|
2809
|
-
<button type="button" class="btn btn-light btn-sm flex-fill"
|
|
2810
|
-
data-bind="click: function(){ tableSettings().border('inner'); updateTable(); }, css: { active: tableSettings().border === 'inner' }">Inside</button>
|
|
2811
|
-
</div>
|
|
2812
|
-
</div>
|
|
2813
|
-
<div class="form-group row">
|
|
2814
|
-
<div class="mb-2 col-6" style="display: none;">
|
|
2815
|
-
<label class="form-label small">Border Color</label>
|
|
2816
|
-
<input type="color" class="color-picker"
|
|
2817
|
-
data-bind="value: tableSettings().borderColor, event: { change: updateTable }"/>
|
|
2818
|
-
</div>
|
|
2819
|
-
<div class="mb-2 col-6 d-flex align-items-end">
|
|
2820
|
-
<button class="btn btn-sm small btn-outline-secondary" data-bind="click: clearTableSettings">
|
|
2821
|
-
Clear
|
|
2822
|
-
</button>
|
|
2823
|
-
</div>
|
|
2824
|
-
</div>
|
|
2825
|
-
</div>
|
|
2826
|
-
</div>
|
|
2827
|
-
</div>
|
|
2828
|
-
</div>
|
|
2829
|
-
</script>
|
|
2830
|
-
|
|
2831
|
-
<div class="modal" id="drilldownModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2832
|
-
<div class="modal-dialog modal-lg">
|
|
2833
|
-
<div class="modal-content" data-bind="with: ChartDrillDownData">
|
|
2834
|
-
<div class="modal-header">
|
|
2835
|
-
<h4 class="modal-title">Drilldown Data</h4>
|
|
2836
|
-
<button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2837
|
-
</div>
|
|
2838
|
-
<!-- ko if: DrillDownData -->
|
|
2839
|
-
<div class="modal-body">
|
|
2840
|
-
<div style="overflow-x: auto; max-height: 500px; overflow-y: auto;">
|
|
2841
|
-
<table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData, attr: {class: 'table table-striped table-hover table-condensed ' + $parent.selectedStyle()}">
|
|
2842
|
-
<thead style="position: sticky; top: -1px; z-index: 2;">
|
|
2843
|
-
<tr class="no-highlight">
|
|
2844
|
-
<!-- ko foreach: Columns -->
|
|
2845
|
-
<th data-bind="attr: { id: fieldId }, css: {'right-align': IsNumeric}, style: {'width': fieldWidth, 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
|
|
2846
|
-
<span data-bind="text: fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName), style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
|
|
2847
|
-
</th>
|
|
2848
|
-
<!-- /ko -->
|
|
2849
|
-
</tr>
|
|
2850
|
-
</thead>
|
|
2851
|
-
<tbody>
|
|
2852
|
-
<tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
|
|
2853
|
-
<td data-bind="attr:{colspan: Columns.length}">
|
|
2854
|
-
No records found
|
|
2855
|
-
</td>
|
|
2856
|
-
</tr>
|
|
2857
|
-
<!-- ko foreach: Rows -->
|
|
2858
|
-
<tr>
|
|
2859
|
-
<!-- ko foreach: Items -->
|
|
2860
|
-
<td data-bind="hidden: outerGroup, style: {'background-color': backColor, 'color': fontColor, 'font-weight': fontBold() ? 'bold' : 'normal' }">
|
|
2861
|
-
<div data-bind="style: {'width': fieldWidth }">
|
|
2862
|
-
<!-- ko if: LinkTo-->
|
|
2863
|
-
<a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
|
|
2864
|
-
<!-- /ko-->
|
|
2865
|
-
<!-- ko ifnot: LinkTo-->
|
|
2866
|
-
<span data-bind="html: formattedVal"></span>
|
|
2867
|
-
<!-- /ko-->
|
|
2868
|
-
</div>
|
|
2869
|
-
</td>
|
|
2870
|
-
<!-- /ko-->
|
|
2871
|
-
</tr>
|
|
2872
|
-
<!-- /ko -->
|
|
2873
|
-
</tbody>
|
|
2874
|
-
</table>
|
|
2875
|
-
</div>
|
|
2876
|
-
</div>
|
|
2877
|
-
<div class="modal-footer">
|
|
2878
|
-
<div class="col-xs-12 col-centered" data-bind="with: pager">
|
|
2879
|
-
<div class="form-inline small text-muted">
|
|
2880
|
-
<div class="pull-left total-records" data-bind="visible: pages()">
|
|
2881
|
-
<span data-bind="text: 'Total Records: ' + totalRecords()"></span>
|
|
2882
|
-
</div>
|
|
2883
|
-
<div class="pull-left">
|
|
2884
|
-
<button class="btn btn-xs" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></button>
|
|
2885
|
-
<button class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
|
|
2886
|
-
<span class="fa fa-code"></span> View Code
|
|
2887
|
-
</button>
|
|
2888
|
-
</div>
|
|
2889
|
-
<div class="form-group pull-right" data-bind="visible: pages()">
|
|
2890
|
-
<div data-bind="template: 'pager-template', data: $data"></div>
|
|
2891
|
-
</div>
|
|
2892
|
-
</div>
|
|
2893
|
-
</div>
|
|
2894
|
-
</div>
|
|
2895
|
-
<!-- /ko -->
|
|
2896
|
-
</div>
|
|
2897
|
-
</div>
|
|
2898
|
-
</div>
|
|
2899
|
-
|
|
2900
|
-
<div class="modal" id="sqlModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2901
|
-
<div class="modal-dialog modal-lg">
|
|
2902
|
-
<div class="modal-content">
|
|
2903
|
-
<div class="modal-header d-flex justify-content-between align-items-center">
|
|
2904
|
-
<h4 class="modal-title">Report Code</h4>
|
|
2905
|
-
<button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
|
|
2906
|
-
data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
|
|
2907
|
-
<i class="fa fa-clipboard"></i> Copy
|
|
2908
|
-
</button>
|
|
2909
|
-
<button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2910
|
-
</div>
|
|
2911
|
-
<div class="modal-body" data-bind="with: ReportResult">
|
|
2912
|
-
<div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
|
|
2913
|
-
<pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
|
|
2914
|
-
</div>
|
|
2915
|
-
</div>
|
|
2916
|
-
</div>
|
|
2917
|
-
</div>
|
|
2918
|
-
</div>
|
|
2919
|
-
|
|
2920
|
-
<div class="modal" id="sqlDrillDownModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2921
|
-
<div class="modal-dialog modal-lg">
|
|
2922
|
-
<div class="modal-content" data-bind="with:ChartDrillDownData">
|
|
2923
|
-
<div class="modal-header d-flex justify-content-between align-items-center">
|
|
2924
|
-
<h4 class="modal-title">Drill Down Report Code</h4>
|
|
2925
|
-
<button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
|
|
2926
|
-
data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
|
|
2927
|
-
<i class="fa fa-clipboard"></i> Copy
|
|
2928
|
-
</button>
|
|
2929
|
-
<button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2930
|
-
</div>
|
|
2931
|
-
<div class="modal-body" data-bind="with:DrillDownData">
|
|
2932
|
-
<div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
|
|
2933
|
-
<pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
|
|
2934
|
-
</div>
|
|
2935
|
-
</div>
|
|
2936
|
-
</div>
|
|
2937
|
-
</div>
|
|
2938
|
-
</div>
|
|
2939
|
-
<div class="modal" id="noaccountModal" tabindex="-1" role="dialog" aria-hidden="true">
|
|
2940
|
-
<div class="modal-dialog">
|
|
2941
|
-
<div class="modal-content">
|
|
2942
|
-
<div class="modal-header">
|
|
2943
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2944
|
-
<h4 class="modal-title">Account not Setup</h4>
|
|
2945
|
-
</div>
|
|
2946
|
-
<div class="modal-body">
|
|
2947
|
-
<p class="alert alert-danger">dotnet Report Account Configuration missing!</p>
|
|
2948
|
-
<p>You do not have the neccessary initial configuration completed to use dotnet Report.</p>
|
|
2949
|
-
<p>Please view the <a href="https://dotnetreport.com/blogs/getting-started-with-dotnet-report/" target="_blank">Getting Started Guide</a> to correctly configure dotnet Report.</p>
|
|
2950
|
-
</div>
|
|
2951
|
-
<div class="modal-footer">
|
|
2952
|
-
<button type="button" class="btn btn-default" data-bs-dismiss="modal">Close</button>
|
|
2953
|
-
</div>
|
|
2954
|
-
</div>
|
|
2955
|
-
</div>
|
|
2956
|
-
</div>
|
|
2957
|
-
<script type="text/html" id="pdf-options-schedule-template">
|
|
2958
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
2959
|
-
<div class="modal-content" data-bind="with: PdfPage">
|
|
2960
|
-
<div class="modal-header">
|
|
2961
|
-
<h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
|
|
2962
|
-
<i class="fa fa-file-pdf-o me-2"></i> Set PDF Page Size
|
|
2963
|
-
</h5>
|
|
2964
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
2965
|
-
</div>
|
|
2966
|
-
<div class="modal-body row g-0">
|
|
2967
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
2968
|
-
<div id="pagePreviewBox" class="text-center">
|
|
2969
|
-
<div data-bind="style: {
|
|
2970
|
-
width: selectedWidth(),
|
|
2971
|
-
height: selectedHeight(),
|
|
2972
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
2973
|
-
transition: 'all 0.3s ease'
|
|
2974
|
-
}"
|
|
2975
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
2976
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
2977
|
-
</div>
|
|
2978
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
2979
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
2980
|
-
</div>
|
|
2981
|
-
</div>
|
|
2982
|
-
<div class="col-md-7">
|
|
2983
|
-
<div class="mb-3">
|
|
2984
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
2985
|
-
<select class="form-select" id="pageSizeSelect"
|
|
2986
|
-
data-bind="options: availablePageSizes,
|
|
2987
|
-
optionsText: 'label',
|
|
2988
|
-
optionsValue: 'value',
|
|
2989
|
-
value: selectedPageSize">
|
|
2990
|
-
</select>
|
|
2991
|
-
</div>
|
|
2992
|
-
<div class="mb-3">
|
|
2993
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
2994
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
2995
|
-
data-bind="options: availablePageOrientation,
|
|
2996
|
-
optionsText: 'label',
|
|
2997
|
-
optionsValue: 'value',
|
|
2998
|
-
value: selectedPageOrientation">
|
|
2999
|
-
</select>
|
|
3000
|
-
</div>
|
|
3001
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3002
|
-
This PDF will be exported using the selected page size. Ensure your content fits well.
|
|
3003
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3004
|
-
</div>
|
|
3005
|
-
</div>
|
|
3006
|
-
</div>
|
|
3007
|
-
<div class="modal-footer">
|
|
3008
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3009
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
|
|
3010
|
-
Save
|
|
3011
|
-
</button>
|
|
3012
|
-
</div>
|
|
3013
|
-
</div>
|
|
3014
|
-
</div>
|
|
3015
|
-
</script>
|
|
3016
|
-
<script type="text/html" id="word-options-schedule-template">
|
|
3017
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
3018
|
-
<div class="modal-content" data-bind="with: WordPage">
|
|
3019
|
-
<div class="modal-header">
|
|
3020
|
-
<h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
|
|
3021
|
-
<i class="fa fa-file-pdf-o me-2"></i> Set WORD Page Size
|
|
3022
|
-
</h5>
|
|
3023
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
3024
|
-
</div>
|
|
3025
|
-
<div class="modal-body row g-0">
|
|
3026
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
3027
|
-
<div id="pagePreviewBox" class="text-center">
|
|
3028
|
-
<div data-bind="style: {
|
|
3029
|
-
width: selectedWidth(),
|
|
3030
|
-
height: selectedHeight(),
|
|
3031
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
3032
|
-
transition: 'all 0.3s ease'
|
|
3033
|
-
}"
|
|
3034
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
3035
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
3036
|
-
</div>
|
|
3037
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
3038
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
3039
|
-
</div>
|
|
3040
|
-
</div>
|
|
3041
|
-
<div class="col-md-7">
|
|
3042
|
-
<div class="mb-3">
|
|
3043
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
3044
|
-
<select class="form-select" id="pageSizeSelect"
|
|
3045
|
-
data-bind="options: availablePageSizes,
|
|
3046
|
-
optionsText: 'label',
|
|
3047
|
-
optionsValue: 'value',
|
|
3048
|
-
value: selectedPageSize">
|
|
3049
|
-
</select>
|
|
3050
|
-
</div>
|
|
3051
|
-
<div class="mb-3">
|
|
3052
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
3053
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
3054
|
-
data-bind="options: availablePageOrientation,
|
|
3055
|
-
optionsText: 'label',
|
|
3056
|
-
optionsValue: 'value',
|
|
3057
|
-
value: selectedPageOrientation">
|
|
3058
|
-
</select>
|
|
3059
|
-
</div>
|
|
3060
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3061
|
-
This WORD will be exported using the selected page size. Ensure your content fits well.
|
|
3062
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3063
|
-
</div>
|
|
3064
|
-
</div>
|
|
3065
|
-
</div>
|
|
3066
|
-
<div class="modal-footer">
|
|
3067
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3068
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
|
|
3069
|
-
Save
|
|
3070
|
-
</button>
|
|
3071
|
-
</div>
|
|
3072
|
-
</div>
|
|
3073
|
-
</div>
|
|
3074
|
-
</script>
|
|
3075
|
-
<script type="text/html" id="word-options-template">
|
|
3076
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
3077
|
-
<div class="modal-content" data-bind="with: WordPage">
|
|
3078
|
-
<div class="modal-header">
|
|
3079
|
-
<h5 class="modal-title" id="wordOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to WORD</h5>
|
|
3080
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
3081
|
-
</div>
|
|
3082
|
-
<div class="modal-body row g-0">
|
|
3083
|
-
<!-- Left Side: Page Preview SVG -->
|
|
3084
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
3085
|
-
<div id="pagePreviewBox" class="text-center">
|
|
3086
|
-
<div data-bind="style: {
|
|
3087
|
-
width: selectedWidth(),
|
|
3088
|
-
height: selectedHeight(),
|
|
3089
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
3090
|
-
transition: 'all 0.3s ease'
|
|
3091
|
-
}"
|
|
3092
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
3093
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
3094
|
-
</div>
|
|
3095
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
3096
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
3097
|
-
</div>
|
|
3098
|
-
</div>
|
|
3099
|
-
|
|
3100
|
-
<!-- Right Side: Form Options -->
|
|
3101
|
-
<div class="col-md-7">
|
|
3102
|
-
<div class="mb-3">
|
|
3103
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
3104
|
-
<select class="form-select" id="pageSizeSelect"
|
|
3105
|
-
data-bind="options: availablePageSizes,
|
|
3106
|
-
optionsText: 'label',
|
|
3107
|
-
optionsValue: 'value',
|
|
3108
|
-
value: selectedPageSize">
|
|
3109
|
-
</select>
|
|
3110
|
-
</div>
|
|
3111
|
-
<div class="mb-3">
|
|
3112
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
3113
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
3114
|
-
data-bind="options: availablePageOrientation,
|
|
3115
|
-
optionsText: 'label',
|
|
3116
|
-
optionsValue: 'value',
|
|
3117
|
-
value: selectedPageOrientation">
|
|
3118
|
-
</select>
|
|
3119
|
-
</div>
|
|
3120
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3121
|
-
This Word will be exported using the selected page size. Ensure your content fits well.
|
|
3122
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3123
|
-
</div>
|
|
3124
|
-
</div>
|
|
3125
|
-
</div>
|
|
3126
|
-
<div class="modal-footer">
|
|
3127
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3128
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
|
|
3129
|
-
<i class="fa fa-download me-1"></i> Download WORD
|
|
3130
|
-
</button>
|
|
3131
|
-
</div>
|
|
3132
|
-
</div>
|
|
3133
|
-
</div>
|
|
3134
|
-
</script>
|
|
3135
|
-
<script type="text/html" id="pdf-options-template">
|
|
3136
|
-
<div class="modal-dialog modal-dialog-centered">
|
|
3137
|
-
<div class="modal-content" data-bind="with: PdfPage">
|
|
3138
|
-
<div class="modal-header">
|
|
3139
|
-
<h5 class="modal-title" id="pdfOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to PDF</h5>
|
|
3140
|
-
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
3141
|
-
</div>
|
|
3142
|
-
<div class="modal-body row g-0">
|
|
3143
|
-
<!-- Left Side: Page Preview SVG -->
|
|
3144
|
-
<div class="col-md-5 d-flex justify-content-center align-items-center">
|
|
3145
|
-
<div id="pagePreviewBox" class="text-center">
|
|
3146
|
-
<div data-bind="style: {
|
|
3147
|
-
width: selectedWidth(),
|
|
3148
|
-
height: selectedHeight(),
|
|
3149
|
-
backgroundColor: selectedBackgroundStyle(),
|
|
3150
|
-
transition: 'all 0.3s ease'
|
|
3151
|
-
}"
|
|
3152
|
-
class="shadow rounded mx-auto mb-2 border position-relative">
|
|
3153
|
-
<span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
|
|
3154
|
-
</div>
|
|
3155
|
-
<div data-bind="text: selectedPageLabel" class="fw-bold"></div>
|
|
3156
|
-
<div data-bind="text: selectedPageDimension" class="text-muted small"></div>
|
|
3157
|
-
</div>
|
|
3158
|
-
</div>
|
|
3159
|
-
|
|
3160
|
-
<!-- Right Side: Form Options -->
|
|
3161
|
-
<div class="col-md-7">
|
|
3162
|
-
<div class="mb-3">
|
|
3163
|
-
<label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
|
|
3164
|
-
<select class="form-select" id="pageSizeSelect"
|
|
3165
|
-
data-bind="options: availablePageSizes,
|
|
3166
|
-
optionsText: 'label',
|
|
3167
|
-
optionsValue: 'value',
|
|
3168
|
-
value: selectedPageSize">
|
|
3169
|
-
</select>
|
|
3170
|
-
</div>
|
|
3171
|
-
<div class="mb-3">
|
|
3172
|
-
<label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
|
|
3173
|
-
<select class="form-select" id="pageOrientationSelect"
|
|
3174
|
-
data-bind="options: availablePageOrientation,
|
|
3175
|
-
optionsText: 'label',
|
|
3176
|
-
optionsValue: 'value',
|
|
3177
|
-
value: selectedPageOrientation">
|
|
3178
|
-
</select>
|
|
3179
|
-
</div>
|
|
3180
|
-
<div class="alert alert-info p-2 small mt-2">
|
|
3181
|
-
This PDF will be exported using the selected page size. Ensure your content fits well.
|
|
3182
|
-
If the content width exceeds the selected size, it will default to Letter.
|
|
3183
|
-
</div>
|
|
3184
|
-
</div>
|
|
3185
|
-
</div>
|
|
3186
|
-
<div class="modal-footer">
|
|
3187
|
-
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
|
|
3188
|
-
<button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
|
|
3189
|
-
<i class="fa fa-download me-1"></i> Download PDF
|
|
3190
|
-
</button>
|
|
3191
|
-
</div>
|
|
3192
|
-
</div>
|
|
3193
|
-
</div>
|
|
3194
|
-
</script>
|
|
3195
|
-
`);
|
|
3196
|
-
this.cdref.detectChanges();
|
|
3197
|
-
}
|
|
3198
|
-
bindWindowResize(vm) {
|
|
3199
|
-
let _vm = vm;
|
|
3200
|
-
$(window).resize(function () {
|
|
3201
|
-
_vm.drawChart();
|
|
3202
|
-
});
|
|
3203
|
-
}
|
|
3204
|
-
bindGridInit(vm) {
|
|
3205
|
-
let _vm = vm;
|
|
3206
|
-
$(function () {
|
|
3207
|
-
$('.grid-stack').show();
|
|
3208
|
-
var grid = GridStack.init({
|
|
3209
|
-
cellHeight: 60,
|
|
3210
|
-
verticalMargin: 10,
|
|
3211
|
-
resizable: {
|
|
3212
|
-
handles: 'se, sw, ne, nw, n, e, s, w'
|
|
3213
|
-
}
|
|
3214
|
-
});
|
|
3215
|
-
grid.on('change', function (event, items) {
|
|
3216
|
-
if (items) {
|
|
3217
|
-
_.forEach(items, function (x) {
|
|
3218
|
-
_vm.updatePosition(x);
|
|
3219
|
-
});
|
|
3220
|
-
}
|
|
3221
|
-
});
|
|
3222
|
-
grid.on('resizestop', function (event, item) {
|
|
3223
|
-
var e = $(event.target).find('.report-chart');
|
|
3224
|
-
var d = $(event.target).find('table');
|
|
3225
|
-
if (e && !d) {
|
|
3226
|
-
_vm.drawChart();
|
|
3227
|
-
}
|
|
3228
|
-
});
|
|
3229
|
-
setTimeout(function () {
|
|
3230
|
-
_vm.drawChart();
|
|
3231
|
-
grid.enableMove(false);
|
|
3232
|
-
grid.enableResize(false);
|
|
3233
|
-
}, 1000);
|
|
3234
|
-
});
|
|
3235
|
-
}
|
|
3236
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetdashboardComponent, deps: [{ token: i0.Injector }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: BASE_URL_TOKEN }, { token: i2.HttpClient }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
3237
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DotnetdashboardComponent, selector: "app-dotnetdashboard", ngImport: i0, template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n\r\n<div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n<div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-center\">\r\n <ul class=\"nav nav-tabs flex-grow-1\" data-bind=\"foreach: dashboards\">\r\n <li class=\"nav-item\">\r\n <h2>\r\n <a class=\"nav-link\" href=\"#\" data-bind=\"text: name, click: function() { $parent.selectDashboard(id);}, css: { 'active': $parent.currentDashboard().id === id, 'selected-tab': $parent.currentDashboard().id === id }\"></a>\r\n </h2>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex flex-wrap align-items-end gap-2 mt-2 mt-md-0 border-bottom\" style=\"padding-top: 21px;\"> \r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-pencil-square\"></i>\r\n <span>Manage</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: function() { newReport(true) }, visible: currentDashboard().canManage || adminMode()\">\r\n <span class=\"fa fa-plus\"></span> Add New Report\r\n </a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(false) }\">\r\n <span class=\"fa fa-pencil\"></span> Add using Standard Designer\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(true) }\">\r\n <span class=\"fa fa-bolt\"></span> Add using Smarter Designer\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: editDashboard, visible: currentDashboard().canManage || adminMode()\">\r\n <i class=\"fa fa-pencil\"></i>\r\n <span>Edit Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: newDashboard\">\r\n <i class=\"fa fa-dashboard\"></i>\r\n <span>Add a New Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bind=\"click: RefreshAllReports\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfReportsWithPageOption() : ExportAllPdfReports('',''); }, hidden: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfAltReportsWithPageOption() : ExportAllPdfAltReports('',''); }, visible: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelReports\"><i class=\"fa fa-file-excel-o\"></i> Excel</a></li>\r\n <li data-bind=\"visible: canDrilldown\"><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelExpandedReports\"><i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllWordReportsWithPageOption() : ExportAllWordReports('','');}\"><i class=\"fa fa-file-word-o\"></i> Word</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: PrintDashboard\"><i class=\"fa fa-print\"></i> Print</a></li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"if: currentDashboard().canManage || adminMode()\">\r\n <div class=\"btn btn-light btn-sm d-flex align-items-center gap-2\">\r\n <div class=\"form-check form-switch m-0\">\r\n <input class=\"form-check-input\" id=\"arrange-mode\" type=\"checkbox\" data-bind=\"checked: arrangeDashboard\">\r\n </div>\r\n <span>Arrange</span>\r\n </div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm\" role=\"group\">\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomOutDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: resetZoomDashboard\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomInDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"d-flex justify-content-between\">\r\n <div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div data-bind=\"with: currentDashboard\">\r\n <p data-bind=\"text: description\"></p>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"padded-top\"></div>\r\n\r\n<div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n</div>\r\n\r\n<div class=\"centered\" style=\"display: none;\" data-bind=\"visible: dashboards().length == 0 \">\r\n No Dashboards yet. Click below to Start<br />\r\n <button class=\"btn btn-lg btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\"><i class=\"fa fa-dashboard\"></i> Create a New Dashboard</button>\r\n</div>\r\n\r\n<div class=\"modal modal-fullscreen\" id=\"add-dashboard-modal\" tabindex=\"-1\" aria-labelledby=\"add-dashboard-modal-label\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <div class=\"modal-content\" data-bind=\"with: dashboard\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"add-dashboard-modal-label\"><span data-bind=\"text: Id() ? 'Edit' : 'Add'\"></span> Dashboard</h4>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" data-bind=\"click: $root.onModalCloseClicked\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Name</label>\r\n <div class=\"col-md-6\">\r\n <input class=\"form-control\" data-val=\"true\" data-val-required=\"Dashboard Name is required.\" type=\"text\" data-bind=\"value: Name\" placeholder=\"Dashboard Name, e.g., Sales, Accounting\" id=\"add-dash-name\" required />\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Description</label>\r\n <div class=\"col-md-6\">\r\n <textarea class=\"form-control\" data-bind=\"value: Description\" placeholder=\"Optional Description for the Dashboard\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row align-items-center mb-3\">\r\n <div class=\"col-md-6\">\r\n <h5><i class=\"fa fa-paperclip\"></i> Choose Reports for the Dashboard</h5>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Report by Name or Description...\" data-bind=\"textInput: $parent.searchReports\" />\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length==0\">\r\n <div class=\"card card-body\">\r\n No reports found matching your search.\r\n </div>\r\n </div>\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length>0\">\r\n <ul class=\"list-group\" data-bind=\"foreach: $parent.reportsInSearch\">\r\n <li class=\"list-group-item\">\r\n <div class=\"checkbox\">\r\n <label class=\"list-group-item-heading\">\r\n <input type=\"checkbox\" data-bind=\"checked: selected\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></span>\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </label>\r\n </div>\r\n <p class=\"list-group-item-text small\" data-bind=\"text: reportDescription\"></p>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div data-bind=\"if: !$parent.searchReports()\" class=\"list-group mb-3\">\r\n <div data-bind=\"foreach: $parent.reportsAndFolders\">\r\n <div class=\"list-group-item\">\r\n <a role=\"button\" class=\"d-flex justify-content-between align-items-center\" data-bs-toggle=\"collapse\" data-bind=\"attr: {href: '#folder-' + folderId }\" style=\"text-decoration: none; font-weight: normal;\">\r\n <div class=\"d-flex align-items-center\">\r\n <i class=\"fa fa-folder me-2 text-secondary\"></i>\r\n <span data-bind=\"text: folder\"></span>\r\n </div>\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </a>\r\n <div class=\"collapse mt-2\" data-bind=\"attr: {id: 'folder-' + folderId }\">\r\n <ul class=\"list-group list-group-flush\" data-bind=\"foreach: reports\">\r\n <li class=\"list-group-item\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" data-bind=\"checked: selected\">\r\n <label class=\"form-check-label\">\r\n <i class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></i>\r\n <span data-bind=\"text: reportName\"></span>\r\n </label>\r\n </div>\r\n <small class=\"text-muted\" data-bind=\"text: reportDescription\"></small>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card card-body mb-3\">\r\n <h5><i class=\"fa fa-hourglass\"></i> Choose Schedule</h5>\r\n <div data-bind=\"template: {name: 'report-schedule'}\"></div>\r\n </div>\r\n\r\n <div data-bind=\"visible: $parent.adminMode\" class=\"card card-body mb-3\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: manageAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-danger\" data-bind=\"click: $root.deleteDashboard, visible: Id\">Delete Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: $root.saveDashboard\">Save Dashboard</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"grid-stack\" data-bind=\"foreach: reports\" style=\"display: none;\">\r\n <div class=\"grid-stack-item\" data-bind=\"attr: {'gs-x': x, 'gs-y': y, 'gs-w': width, 'gs-h': height, 'gs-auto-position': true, 'gs-id': ReportID}\">\r\n <div class=\"card\" data-bind=\"attr: {class: 'card ' + panelStyle + ' grid-stack-item-content'}, css: { expanded: isExpanded }, style: { border: noDashboardBorders() ? 'none' : '', 'box-shadow': noDashboardBorders() ? 'none' : '' }\" style=\"overflow-y: hidden;\">\r\n <div class=\"padded-div\" style=\"padding-bottom: 0; margin-bottom: 0;\">\r\n <div class=\"pull-left\">\r\n <button type=\"button\" class=\"btn\" data-bs-toggle=\"dropdown\" aria-haspopup=\"false\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-v\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu small\" style=\"z-index: 1001;\">\r\n <li data-bind=\"visible: FlyFilters().length > 0\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: toggleFlyFilters\">\r\n <span class=\"fa fa-filter\"></span> Filter\r\n </a>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-pencil\"></span> Edit\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: openReport\">\r\n <span class=\"fa fa-pencil\"></span> Edit Standard\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-bolt\"></span> Edit Smarter\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\" data-bind=\"visible: ReportType()!='Single'\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\">\r\n <span class=\"fa fa-download\"></span> Export\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadPdfModel() } : function() { $parent.appSettings.useAltPdf ? downloadPdfAlt('','') : downloadPdf('','') }\">\r\n <span class=\"fa fa-file-pdf-o\"></span> PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadWordModel()} : function() { downloadWord('',''); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li data-bind=\"visible: ReportType()!='Single'\">\r\n <a class=\"dropdown-item\" data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + ReportID() }\" target=\"_blank\">\r\n <span class=\"fa fa-folder-open\"></span> Open Report\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: CanEdit() && CanSaveReports()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: $parent.currentDashboard().canManage || $parent.adminMode()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { $parent.removeReportFromDashboard(ReportID()); }\">\r\n <span class=\"fa fa-close\"></span> Remove\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { RefreshReport(ReportID()); }\">\r\n <span class=\"fa fa-refresh\"></span> Refresh\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode, click: getCode\">\r\n <span class=\"fa fa-code\"></span> Report Code\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n\r\n <h2 class=\"pull-left\" data-bind=\"text: ReportName\"></h2>\r\n <div class=\"pull-right\">\r\n <span data-bind=\"visible: isDirty\" class=\"text-warning small\" title=\"You have unsaved changes\">\r\n <i class=\"fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <a class=\"btn btn-link\" data-bind=\"visible: CanEdit() && CanSaveReports() && isDirty(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span>\r\n </a>\r\n <a class=\"btn btn-link\" data-bind=\"click: toggleExpand\"><span class=\"fa\" data-bind=\"css: {'fa-expand': !isExpanded(), 'fa-minus': isExpanded() }, visible: ReportType() != 'Single' && !noDashboardBorders()\"></span></a>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"template: 'report-designer-compact'\"></div>\r\n </div>\r\n <div class=\"card-body list-overflow-auto\" style=\"padding-top: 0; margin-top: 0;\">\r\n <div data-bind=\"if: ReportType()!='Single' && ReportType()!='Html' && CanEdit()\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <p data-bind=\"html: ReportDescription, visible: ReportDescription\"></p>\r\n <div data-bind=\"template: {name: 'fly-filter-template'}, visible: showFlyFilters\"></div>\r\n <div data-bind=\"with: ReportResult\" class=\"small\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline\" data-bind=\"ifnot: noDashboardBorders\">\r\n <div class=\"small\" data-bind=\"with: pager\">\r\n <div class=\"form-group pull-left total-records\" data-bind=\"if: totalRecords()>1 && $parent.ReportType() != 'Single'\">\r\n <span data-bind=\"text: 'Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"form-group pull-right\" data-bind=\"if: pages()>1 && $parent.ReportType() != 'Single'\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllWordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllWordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllPdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllPdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->\r\n\r\n</div>", styles: [".report-chart{min-height:auto!important}.expanded{position:fixed!important;padding:0!important;margin:0!important;top:0!important;left:0!important;width:100%!important;height:100%!important;z-index:1050!important}\n"] });
|
|
3238
|
-
}
|
|
3239
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetdashboardComponent, decorators: [{
|
|
3240
|
-
type: Component,
|
|
3241
|
-
args: [{ selector: 'app-dotnetdashboard', template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n\r\n<div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n<div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-center\">\r\n <ul class=\"nav nav-tabs flex-grow-1\" data-bind=\"foreach: dashboards\">\r\n <li class=\"nav-item\">\r\n <h2>\r\n <a class=\"nav-link\" href=\"#\" data-bind=\"text: name, click: function() { $parent.selectDashboard(id);}, css: { 'active': $parent.currentDashboard().id === id, 'selected-tab': $parent.currentDashboard().id === id }\"></a>\r\n </h2>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex flex-wrap align-items-end gap-2 mt-2 mt-md-0 border-bottom\" style=\"padding-top: 21px;\"> \r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-pencil-square\"></i>\r\n <span>Manage</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: function() { newReport(true) }, visible: currentDashboard().canManage || adminMode()\">\r\n <span class=\"fa fa-plus\"></span> Add New Report\r\n </a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(false) }\">\r\n <span class=\"fa fa-pencil\"></span> Add using Standard Designer\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(true) }\">\r\n <span class=\"fa fa-bolt\"></span> Add using Smarter Designer\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: editDashboard, visible: currentDashboard().canManage || adminMode()\">\r\n <i class=\"fa fa-pencil\"></i>\r\n <span>Edit Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: newDashboard\">\r\n <i class=\"fa fa-dashboard\"></i>\r\n <span>Add a New Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bind=\"click: RefreshAllReports\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfReportsWithPageOption() : ExportAllPdfReports('',''); }, hidden: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfAltReportsWithPageOption() : ExportAllPdfAltReports('',''); }, visible: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelReports\"><i class=\"fa fa-file-excel-o\"></i> Excel</a></li>\r\n <li data-bind=\"visible: canDrilldown\"><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelExpandedReports\"><i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllWordReportsWithPageOption() : ExportAllWordReports('','');}\"><i class=\"fa fa-file-word-o\"></i> Word</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: PrintDashboard\"><i class=\"fa fa-print\"></i> Print</a></li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"if: currentDashboard().canManage || adminMode()\">\r\n <div class=\"btn btn-light btn-sm d-flex align-items-center gap-2\">\r\n <div class=\"form-check form-switch m-0\">\r\n <input class=\"form-check-input\" id=\"arrange-mode\" type=\"checkbox\" data-bind=\"checked: arrangeDashboard\">\r\n </div>\r\n <span>Arrange</span>\r\n </div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm\" role=\"group\">\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomOutDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: resetZoomDashboard\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomInDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"d-flex justify-content-between\">\r\n <div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div data-bind=\"with: currentDashboard\">\r\n <p data-bind=\"text: description\"></p>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"padded-top\"></div>\r\n\r\n<div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n</div>\r\n\r\n<div class=\"centered\" style=\"display: none;\" data-bind=\"visible: dashboards().length == 0 \">\r\n No Dashboards yet. Click below to Start<br />\r\n <button class=\"btn btn-lg btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\"><i class=\"fa fa-dashboard\"></i> Create a New Dashboard</button>\r\n</div>\r\n\r\n<div class=\"modal modal-fullscreen\" id=\"add-dashboard-modal\" tabindex=\"-1\" aria-labelledby=\"add-dashboard-modal-label\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <div class=\"modal-content\" data-bind=\"with: dashboard\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"add-dashboard-modal-label\"><span data-bind=\"text: Id() ? 'Edit' : 'Add'\"></span> Dashboard</h4>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" data-bind=\"click: $root.onModalCloseClicked\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Name</label>\r\n <div class=\"col-md-6\">\r\n <input class=\"form-control\" data-val=\"true\" data-val-required=\"Dashboard Name is required.\" type=\"text\" data-bind=\"value: Name\" placeholder=\"Dashboard Name, e.g., Sales, Accounting\" id=\"add-dash-name\" required />\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Description</label>\r\n <div class=\"col-md-6\">\r\n <textarea class=\"form-control\" data-bind=\"value: Description\" placeholder=\"Optional Description for the Dashboard\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row align-items-center mb-3\">\r\n <div class=\"col-md-6\">\r\n <h5><i class=\"fa fa-paperclip\"></i> Choose Reports for the Dashboard</h5>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Report by Name or Description...\" data-bind=\"textInput: $parent.searchReports\" />\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length==0\">\r\n <div class=\"card card-body\">\r\n No reports found matching your search.\r\n </div>\r\n </div>\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length>0\">\r\n <ul class=\"list-group\" data-bind=\"foreach: $parent.reportsInSearch\">\r\n <li class=\"list-group-item\">\r\n <div class=\"checkbox\">\r\n <label class=\"list-group-item-heading\">\r\n <input type=\"checkbox\" data-bind=\"checked: selected\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></span>\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </label>\r\n </div>\r\n <p class=\"list-group-item-text small\" data-bind=\"text: reportDescription\"></p>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div data-bind=\"if: !$parent.searchReports()\" class=\"list-group mb-3\">\r\n <div data-bind=\"foreach: $parent.reportsAndFolders\">\r\n <div class=\"list-group-item\">\r\n <a role=\"button\" class=\"d-flex justify-content-between align-items-center\" data-bs-toggle=\"collapse\" data-bind=\"attr: {href: '#folder-' + folderId }\" style=\"text-decoration: none; font-weight: normal;\">\r\n <div class=\"d-flex align-items-center\">\r\n <i class=\"fa fa-folder me-2 text-secondary\"></i>\r\n <span data-bind=\"text: folder\"></span>\r\n </div>\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </a>\r\n <div class=\"collapse mt-2\" data-bind=\"attr: {id: 'folder-' + folderId }\">\r\n <ul class=\"list-group list-group-flush\" data-bind=\"foreach: reports\">\r\n <li class=\"list-group-item\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" data-bind=\"checked: selected\">\r\n <label class=\"form-check-label\">\r\n <i class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></i>\r\n <span data-bind=\"text: reportName\"></span>\r\n </label>\r\n </div>\r\n <small class=\"text-muted\" data-bind=\"text: reportDescription\"></small>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card card-body mb-3\">\r\n <h5><i class=\"fa fa-hourglass\"></i> Choose Schedule</h5>\r\n <div data-bind=\"template: {name: 'report-schedule'}\"></div>\r\n </div>\r\n\r\n <div data-bind=\"visible: $parent.adminMode\" class=\"card card-body mb-3\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: manageAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-danger\" data-bind=\"click: $root.deleteDashboard, visible: Id\">Delete Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: $root.saveDashboard\">Save Dashboard</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"grid-stack\" data-bind=\"foreach: reports\" style=\"display: none;\">\r\n <div class=\"grid-stack-item\" data-bind=\"attr: {'gs-x': x, 'gs-y': y, 'gs-w': width, 'gs-h': height, 'gs-auto-position': true, 'gs-id': ReportID}\">\r\n <div class=\"card\" data-bind=\"attr: {class: 'card ' + panelStyle + ' grid-stack-item-content'}, css: { expanded: isExpanded }, style: { border: noDashboardBorders() ? 'none' : '', 'box-shadow': noDashboardBorders() ? 'none' : '' }\" style=\"overflow-y: hidden;\">\r\n <div class=\"padded-div\" style=\"padding-bottom: 0; margin-bottom: 0;\">\r\n <div class=\"pull-left\">\r\n <button type=\"button\" class=\"btn\" data-bs-toggle=\"dropdown\" aria-haspopup=\"false\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-v\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu small\" style=\"z-index: 1001;\">\r\n <li data-bind=\"visible: FlyFilters().length > 0\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: toggleFlyFilters\">\r\n <span class=\"fa fa-filter\"></span> Filter\r\n </a>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-pencil\"></span> Edit\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: openReport\">\r\n <span class=\"fa fa-pencil\"></span> Edit Standard\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-bolt\"></span> Edit Smarter\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\" data-bind=\"visible: ReportType()!='Single'\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\">\r\n <span class=\"fa fa-download\"></span> Export\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadPdfModel() } : function() { $parent.appSettings.useAltPdf ? downloadPdfAlt('','') : downloadPdf('','') }\">\r\n <span class=\"fa fa-file-pdf-o\"></span> PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadWordModel()} : function() { downloadWord('',''); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li data-bind=\"visible: ReportType()!='Single'\">\r\n <a class=\"dropdown-item\" data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + ReportID() }\" target=\"_blank\">\r\n <span class=\"fa fa-folder-open\"></span> Open Report\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: CanEdit() && CanSaveReports()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: $parent.currentDashboard().canManage || $parent.adminMode()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { $parent.removeReportFromDashboard(ReportID()); }\">\r\n <span class=\"fa fa-close\"></span> Remove\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { RefreshReport(ReportID()); }\">\r\n <span class=\"fa fa-refresh\"></span> Refresh\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode, click: getCode\">\r\n <span class=\"fa fa-code\"></span> Report Code\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n\r\n <h2 class=\"pull-left\" data-bind=\"text: ReportName\"></h2>\r\n <div class=\"pull-right\">\r\n <span data-bind=\"visible: isDirty\" class=\"text-warning small\" title=\"You have unsaved changes\">\r\n <i class=\"fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <a class=\"btn btn-link\" data-bind=\"visible: CanEdit() && CanSaveReports() && isDirty(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span>\r\n </a>\r\n <a class=\"btn btn-link\" data-bind=\"click: toggleExpand\"><span class=\"fa\" data-bind=\"css: {'fa-expand': !isExpanded(), 'fa-minus': isExpanded() }, visible: ReportType() != 'Single' && !noDashboardBorders()\"></span></a>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"template: 'report-designer-compact'\"></div>\r\n </div>\r\n <div class=\"card-body list-overflow-auto\" style=\"padding-top: 0; margin-top: 0;\">\r\n <div data-bind=\"if: ReportType()!='Single' && ReportType()!='Html' && CanEdit()\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <p data-bind=\"html: ReportDescription, visible: ReportDescription\"></p>\r\n <div data-bind=\"template: {name: 'fly-filter-template'}, visible: showFlyFilters\"></div>\r\n <div data-bind=\"with: ReportResult\" class=\"small\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline\" data-bind=\"ifnot: noDashboardBorders\">\r\n <div class=\"small\" data-bind=\"with: pager\">\r\n <div class=\"form-group pull-left total-records\" data-bind=\"if: totalRecords()>1 && $parent.ReportType() != 'Single'\">\r\n <span data-bind=\"text: 'Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"form-group pull-right\" data-bind=\"if: pages()>1 && $parent.ReportType() != 'Single'\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllWordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllWordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllPdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllPdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->\r\n\r\n</div>", styles: [".report-chart{min-height:auto!important}.expanded{position:fixed!important;padding:0!important;margin:0!important;top:0!important;left:0!important;width:100%!important;height:100%!important;z-index:1050!important}\n"] }]
|
|
3242
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
|
|
3243
|
-
type: Inject,
|
|
3244
|
-
args: [BASE_URL_TOKEN]
|
|
3245
|
-
}] }, { type: i2.HttpClient }, { type: i3.ActivatedRoute }] });
|
|
3246
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRkYXNoYm9hcmQvZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRkYXNoYm9hcmQvZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWdCMUQsTUFBTSxPQUFPLHdCQUF3QjtJQU12QjtJQUNBO0lBQ3dCO0lBQ3hCO0lBQ0E7SUFURixjQUFjLENBQVM7SUFDeEIsZUFBZSxDQUFXO0lBQ3pCLFdBQVcsQ0FBNEI7SUFFL0MsWUFBWSxRQUFrQixFQUNwQixTQUF1QixFQUN2QixLQUF3QixFQUNBLE9BQWUsRUFDdkMsSUFBZ0IsRUFDaEIsS0FBcUI7UUFKckIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUNBLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUUzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsOEJBQThCO1FBQzNFLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFSCxRQUFRO1FBQ0osSUFBSSxPQUFPLEdBQXNILEVBQUUsQ0FBQztRQUNwSSxJQUFJLFVBQVUsR0FBNE0sRUFBRSxDQUFDO1FBQzdOLElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDakUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLDJDQUEyQyxHQUFHLFNBQVMsQ0FBQztRQUNyRyxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcscUNBQXFDLENBQUM7UUFDckYsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLG1DQUFtQyxDQUFDO1FBQ3BGLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFrQixFQUFFLEVBQUU7WUFDN0QsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUssRUFBQyxFQUFFO2dCQUMzQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMsUUFBUSxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNsUyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQ25ELElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLENBQUM7WUFFOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRTtnQkFDcEYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO29CQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUM3SyxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO29CQUUzRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7b0JBQ3RCLElBQUksRUFBRSxHQUFHLElBQUksa0JBQWtCLENBQUM7d0JBQzVCLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLHNCQUFzQjt3QkFDMUQsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsNEJBQTRCO3dCQUNqRSxnQkFBZ0IsRUFBQyxJQUFJLENBQUMsY0FBYyxHQUFFLGdDQUFnQzt3QkFDdEUsWUFBWSxFQUFFLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0NBQWdDO3dCQUNyRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxnQ0FBZ0M7d0JBQzlELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLCtCQUErQjt3QkFDdEUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQ0FBbUM7d0JBQzNFLFVBQVUsRUFBRSxTQUFTO3dCQUNyQixTQUFTLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQzt3QkFDMUIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO3dCQUMxQyxPQUFPLEVBQUUsT0FBTzt3QkFDaEIsVUFBVSxFQUFFLFVBQVU7d0JBQ3RCLFlBQVksRUFBRSxNQUFNO3dCQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7d0JBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzt3QkFDM0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxjQUFjO3dCQUNqQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7d0JBQy9CLFdBQVcsRUFBRSxXQUFXO3dCQUN4QixZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUI7d0JBQ3ZELGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLDJCQUEyQjt3QkFDMUQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxxQ0FBcUM7d0JBQ2pGLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFFLGdDQUFnQzt3QkFDdEUsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsa0NBQWtDO3dCQUN6RSxtQkFBbUIsRUFBRSxtQkFBbUI7d0JBQ3hDLGFBQWEsRUFBRSxJQUFJO3FCQUN0QixDQUFDLENBQUM7b0JBRUgsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7d0JBRWxDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUN6QixFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt3QkFFaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5QixDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUgsV0FBVztRQUNQLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVPLGlCQUFpQjtRQUV2QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThoR2pFLENBQUMsQ0FBQztRQUNDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEVBQU87UUFDOUIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNiLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsRUFBTTtRQUN6QixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFYixDQUFDLENBQUM7WUFDRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDdEIsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLFNBQVMsRUFBRTtvQkFDUCxPQUFPLEVBQUUsNEJBQTRCO2lCQUN4QzthQUNKLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVMsS0FBVSxFQUFFLEtBQVk7Z0JBQ2pELElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1YsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBUyxDQUFNO3dCQUM5QixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFTLEtBQXVCLEVBQUUsSUFBb0M7Z0JBQ3hGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDWCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQztnQkFDWCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFHTCxDQUFDO3dHQTFxR1Usd0JBQXdCLHVHQVF2QixjQUFjOzRGQVJmLHdCQUF3QiwyRENuQnJDLDIwMEJBcVlNOzs0RkRsWE8sd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLHFCQUFxQjs7MEJBYzFCLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQkFTRV9VUkxfVE9LRU4gfSBmcm9tICcuLy4uL2RvdG5ldHJlcG9ydC1saWIuZGknO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5kZWNsYXJlIHZhciBrbzogYW55O1xyXG5kZWNsYXJlIHZhciBkYXNoYm9hcmRWaWV3TW9kZWw6IGFueTtcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5kZWNsYXJlIHZhciBHcmlkU3RhY2s6IGFueTtcclxuZGVjbGFyZSB2YXIgXzogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZG90bmV0ZGFzaGJvYXJkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kb3RuZXRkYXNoYm9hcmQuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbiBcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3RuZXRkYXNoYm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIGJhc2VTZXJ2aWNlVXJsOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgcmVwb3J0VGVtcGxhdGVzOiBTYWZlSHRtbDtcclxuICAgIHByaXZhdGUgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICAgIHByaXZhdGUgY2RyZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICBASW5qZWN0KEJBU0VfVVJMX1RPS0VOKSBwcml2YXRlIGJhc2VVcmw6IHN0cmluZyxcclxuICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkgeyBcclxuICBcclxuICAgICAgICB0aGlzLmJhc2VTZXJ2aWNlVXJsID0gdGhpcy5iYXNlVXJsICsgJy9hcGknOyAvLyBcImh0dHA6Ly9sb2NhbGhvc3Q6MzkzNzhcIjsgXFxcclxuICAgICAgICB0aGlzLnJlcG9ydFRlbXBsYXRlcyA9IFwiXCI7XHJcbiAgICAgIH1cclxuICBcclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHZhciByZXBvcnRzOiB7IHJlcG9ydFNxbDogYW55OyByZXBvcnRJZDogYW55OyByZXBvcnRGaWx0ZXI6IGFueTsgY29ubmVjdEtleTogYW55OyB4OiBhbnk7IHk6IGFueTsgd2lkdGg6IGFueTsgaGVpZ2h0OiBhbnk7IH1bXSA9IFtdO1xyXG4gICAgICAgIHZhciBkYXNoYm9hcmRzOiB7IGlkOiBhbnk7IG5hbWU6IGFueTsgZGVzY3JpcHRpb246IGFueTsgc2VsZWN0ZWRSZXBvcnRzOiBhbnk7IHNjaGVkdWxlOmFueTsgdXNlcklkOiBhbnk7IHVzZXJSb2xlczogYW55OyB2aWV3T25seVVzZXJJZDogYW55OyB2aWV3T25seVVzZXJSb2xlczogYW55O2NsaWVudElkOmFueTtjYW5NYW5hZ2U6YW55IH1bXSB8IHsgaWQ6IG51bWJlcjsgfVtdID0gW107XHJcbiAgICAgICAgdmFyIGFkbWluTW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZXBvcnRBZG1pbk1vZGUnKSA/PyBmYWxzZTsgICAgIFxyXG4gICAgICAgIGxldCBnZXREYXNoYm9hcmRzVXJsID0gdGhpcy5iYXNlU2VydmljZVVybCArIFwiL0RvdE5ldFJlcG9ydEFwaS9HZXREYXNoYm9hcmRzP2FkbWluTW9kZT1cIiArIGFkbWluTW9kZTtcclxuICAgICAgICBsZXQgbG9hZFNhdmVkRGFzaGJvYXJkID0gdGhpcy5iYXNlU2VydmljZVVybCArIFwiL0RvdE5ldFJlcG9ydEFwaS9Mb2FkU2F2ZWREYXNoYm9hcmRcIjtcclxuICAgICAgICBsZXQgZ2V0VXNlcnNBbmRSb2xlc1VybCA9IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyBcIi9Eb3ROZXRSZXBvcnRBcGkvR2V0VXNlcnNBbmRSb2xlc1wiO1xyXG4gICAgICAgIGdldFVzZXJzQW5kUm9sZXNVcmwgPSBnZXRVc2Vyc0FuZFJvbGVzVXJsLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaHR0cC5nZXQoZ2V0RGFzaGJvYXJkc1VybCkuc3Vic2NyaWJlKChkYXNoYm9hcmREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZGFzaGJvYXJkRGF0YS5mb3JFYWNoKChkOmFueSk9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXNoYm9hcmRzLnB1c2goeyBpZDogZC5JZCwgbmFtZTogZC5OYW1lLCBkZXNjcmlwdGlvbjogZC5EZXNjcmlwdGlvbiwgc2VsZWN0ZWRSZXBvcnRzOiBkLlNlbGVjdGVkUmVwb3J0cyxzY2hlZHVsZTpkLlNjaGVkdWxlLCB1c2VySWQ6IGQuVXNlcklkLCB1c2VyUm9sZXM6IGQuVXNlclJvbGVzLCB2aWV3T25seVVzZXJJZDogZC5WaWV3T25seVVzZXJJZCwgdmlld09ubHlVc2VyUm9sZXM6IGQuVmlld09ubHlVc2VyUm9sZXMsY2xpZW50SWQ6ZC5DbGllbnRJZCxjYW5NYW5hZ2U6ZC5DYW5NYW5hZ2UgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICAgICAgICAgIHZhciBkYXNoYm9hcmRJZCA9IHBhcnNlSW50KHRoaXMucXVlcnlQYXJhbXNbJ2lkJ10gfHwgJzAnKTtcclxuICAgICAgICAgICAgaWYgKCFkYXNoYm9hcmRJZCAmJiBkYXNoYm9hcmRzLmxlbmd0aCA+IDApIHsgZGFzaGJvYXJkSWQgPSBkYXNoYm9hcmRzWzBdLmlkOyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0KGxvYWRTYXZlZERhc2hib2FyZCArIFwiP2lkPVwiICsgZGFzaGJvYXJkSWQpLnN1YnNjcmliZSgocmVwb3J0c0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVwb3J0c0RhdGEuZm9yRWFjaCgocjphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRzLnB1c2goeyByZXBvcnRTcWw6IHIuUmVwb3J0U3FsLCByZXBvcnRJZDogci5SZXBvcnRJZCwgcmVwb3J0RmlsdGVyOiByLlJlcG9ydEZpbHRlciwgY29ubmVjdEtleTogci5Db25uZWN0S2V5LCB4OiByLlgsIHk6IHIuWSwgd2lkdGg6IHIuV2lkdGgsIGhlaWdodDogci5IZWlnaHQgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAuZ2V0KGdldFVzZXJzQW5kUm9sZXNVcmwpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZtID0gbmV3IGRhc2hib2FyZFZpZXdNb2RlbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlcG9ydFVybDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0L1JlcG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNSZXBvcnRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9SdW5SZXBvcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5MaW5rUmVwb3J0VXJsOnRoaXMuYmFzZVNlcnZpY2VVcmwgKycvRG90TmV0UmVwb3J0QXBpL1J1blJlcG9ydExpbmsnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRXaXphcmQ6ICQoXCIjbW9kYWwtcmVwb3J0YnVpbGRlclwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwTGlzdFVybDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpL0dldExvb2t1cExpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcGlVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9DYWxsUmVwb3J0QXBpJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVwb3J0QXBpVXJsOiB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgJy9Eb3ROZXRSZXBvcnRBcGkvUnVuUmVwb3J0QXBpJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJvbVNxbDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpL0dldFNjaGVtYUZyb21TcWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRNb2RlOiBcImV4ZWN1dGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua01vZGFsOiAkKFwiI2xpbmtNb2RhbFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRPcHRpb25zTW9kYWw6ICQoXCIjZmllbGRPcHRpb25zTW9kYWxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydHM6IHJlcG9ydHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZHM6IGRhc2hib2FyZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJTZXR0aW5nczogcmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyczogcmVzdWx0LnVzZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUm9sZXM6IHJlc3VsdC51c2VyUm9sZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QWRtaW46IHJlc3VsdC5hbGxvd0FkbWluTW9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbHRlcnM6IHJlc3VsdC5kYXRhRmlsdGVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkSWQ6IGRhc2hib2FyZElkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhwb3J0VXJsOiB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgJy9Eb3ROZXRSZXBvcnRBcGkvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXBvcnRVcmw6IHRoaXMuYmFzZVVybCArICcvRG90TmV0UmVwb3J0L1JlcG9ydFByaW50JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFNhdmVkRGFzaGJvcmRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9Mb2FkU2F2ZWREYXNoYm9hcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXREYXNoYm9yZHNVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKycvRG90TmV0UmVwb3J0QXBpL0dldERhc2hib2FyZHMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRUaW1lWm9uZXNVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9HZXRBbGxUaW1lem9uZXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRVc2Vyc0FuZFJvbGVzVXJsOiBnZXRVc2Vyc0FuZFJvbGVzVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYW1lUGFnZU9uUnVuOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHZtLmluaXQoMCwgcmVzdWx0Lm5vQWNjb3VudCkuZG9uZSgoKT0+e1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJLT1RlbXBsYXRlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrby5hcHBseUJpbmRpbmdzKHZtLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG90LW5ldC1yZXBvcnQnKSk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kR3JpZEluaXQodm0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRXaW5kb3dSZXNpemUodm0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIFxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgICBrby5jbGVhbk5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvdC1uZXQtcmVwb3J0JykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgcmVuZGVyS09UZW1wbGF0ZXMoKSB7XHJcbiAgXHJcbiAgICB0aGlzLnJlcG9ydFRlbXBsYXRlcyA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGA8IS0tIERvdG5ldCBSZXBvcnQgSFRNTCBUZW1wbGF0ZXMgLS0+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWZpbHRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7aWQ6ICdmaWx0ZXItJyt1aUlkIH1cIj5cclxuICAgICAgICA8IS0tIGtvIGlmOiAhaGFzRm9yZWlnbktleS0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IFsnRGF0ZVRpbWUnLCdEYXRlJywnVGltZSddLmluZGV4T2YoZmllbGRUeXBlKSAhPSAtMSAtLT5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnPScsJz4nLCc8JywnPj0nLCc8PScsICdub3QgZXF1YWwnXS5pbmRleE9mKCRwYXJlbnQuT3BlcmF0b3IoKSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cImRhdGVwaWNrZXI6ICRwYXJlbnQuZm10VmFsdWUsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6ICRwYXJlbnQuVmFsdWUsIGRhdGVGb3JtYXQ6IGRhdGVGb3JtYXQoKSA9PT0gJ0N1c3RvbScgPyBjdXN0b21EYXRlRm9ybWF0KCkucmVwbGFjZSgveXl5eS9nLCAneXknKSA6ICRyb290LmRhdGVGb3JtYXRNYXBwaW5nc1tkYXRlRm9ybWF0KCldfVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGZpZWxkVHlwZT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nRGF0ZSBhbmQgVGltZSctLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRpbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTokcGFyZW50LlZhbHVldGltZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogWydiZXR3ZWVuJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgIEZyb21cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCBjbGFzcz1cImZvcm0tY29udHJvbCBmcm9tLWRhdGVcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiAkcGFyZW50LmZtdFZhbHVlLCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiAkcGFyZW50LlZhbHVlLCBkYXRlRm9ybWF0OiBkYXRlRm9ybWF0KCkgPT09ICdDdXN0b20nID8gY3VzdG9tRGF0ZUZvcm1hdCgpLnJlcGxhY2UoL3l5eXkvZywgJ3l5JykgOiAkcm9vdC5kYXRlRm9ybWF0TWFwcGluZ3NbZGF0ZUZvcm1hdCgpXX1cIiAvPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOmZpZWxkVHlwZT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nRGF0ZSBhbmQgVGltZSctLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRpbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTokcGFyZW50LlZhbHVldGltZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB0b1xyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cclxuICAgICAgICAgICAgPGlucHV0IGRhdGEtYmluZD1cImRhdGVwaWNrZXI6ICRwYXJlbnQuZm10VmFsdWUyLCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiAkcGFyZW50LlZhbHVlMiwgZGF0ZUZvcm1hdDogZGF0ZUZvcm1hdCgpID09PSAnQ3VzdG9tJyA/IGN1c3RvbURhdGVGb3JtYXQoKS5yZXBsYWNlKC95eXl5L2csICd5eScpIDogJHJvb3QuZGF0ZUZvcm1hdE1hcHBpbmdzW2RhdGVGb3JtYXQoKV19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdG8tZGF0ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ZmllbGRUeXBlPT0nVGltZScgfHwgZmllbGRGb3JtYXQoKT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdEYXRlIGFuZCBUaW1lJy0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGltZVwiIGRhdGEtYmluZD1cInZhbHVlOiRwYXJlbnQuVmFsdWV0aW1lMlwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ3JhbmdlJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgIDxzZWxlY3QgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWVcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5Ub2RheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRvZGF5ICs8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5Ub2RheSAtPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+WWVzdGVyZGF5PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBXZWVrPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBXZWVrPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBNb250aDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgTW9udGg8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5MYXN0IFllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFdlZWsgVG8gRGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgTW9udGggVG8gRGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgWWVhciBUbyBEYXRlPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCAzMCBEYXlzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwhLS08b3B0aW9uPlRoaXMgTW9udGggTGFzdCBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBNb250aCBMYXN0IFllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5MYXN0IFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5GaXJzdCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+U2Vjb25kIFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlyZCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+Rm91cnRoIFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5OZXh0IDYgTW9udGhzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCA2IE1vbnRoczwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPjIgWWVhcnMgYWdvPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+MyBZZWFycyBhZ288L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj40IFllYXJzIGFnbzwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPjUgWWVhcnMgYWdvPC9vcHRpb24+LS0+XHJcbiAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIkNvbXBhcmlzb24gT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj4+PSBUb2RheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj48PSBUb2RheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj4+PSBUb2RheSArPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uPjw9IFRvZGF5ICs8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gVG9kYXkgLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj48PSBUb2RheSAtPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwvb3B0Z3JvdXA+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5WYWx1ZSgpLmluZGV4T2YoJ1RvZGF5ICsnKSA+PSAwIHx8ICRwYXJlbnQuVmFsdWUoKS5pbmRleE9mKCdUb2RheSAtJykgPj0gMFwiIGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA1cHg7XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtc20gcHVsbC1sZWZ0XCIgc3R5bGU9XCJ3aWR0aDogODBweDtcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJHBhcmVudC5WYWx1ZTJcIiByZXF1aXJlZCAvPjxzcGFuIHN0eWxlPVwicGFkZGluZzogNXB4IDVweDtcIiBjbGFzcz1cInB1bGwtbGVmdFwiPiBkYXlzPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IFsnSW50JywnTW9uZXknLCdGbG9hdCcsJ0RvdWJsZSddLmluZGV4T2YoZmllbGRUeXBlKSAhPSAtMSAtLT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogWyc9JywnPicsJzwnLCc+PScsJzw9JywgJ25vdCBlcXVhbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAmJiBbJ2lzIGJsYW5rJywgJ2lzIG5vdCBibGFuaycsICdpcyBudWxsJywgJ2lzIG5vdCBudWxsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpID09IC0xIC0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwibnVtYmVyXCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUsIGRpc2FibGU6ICRwYXJlbnQuT3BlcmF0b3IoKSA9PSAnaXMgZGVmYXVsdCdcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnaW4nLCAnbm90IGluJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnYmV0d2VlbiddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICAgICAgRnJvbVxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwibnVtYmVyXCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICBUb1xyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwibnVtYmVyXCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUyXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBmaWVsZFR5cGU9PSdCb29sZWFuJyAmJiBbJ2lzIGJsYW5rJywgJ2lzIG5vdCBibGFuaycsICdpcyBudWxsJywgJ2lzIG5vdCBudWxsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpID09IC0xIC0tPlxyXG4gICAgICAgIDxzZWxlY3QgcmVxdWlyZWQgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlLCBkaXNhYmxlOiAkcGFyZW50Lk9wZXJhdG9yKCkgPT0gJ2lzIGRlZmF1bHQnXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+WWVzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+Tm88L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ0ludCcsJ01vbmV5JywnRmxvYXQnLCdEb3VibGUnLCdEYXRlJywnRGF0ZVRpbWUnLCdUaW1lJywnQm9vbGVhbiddLmluZGV4T2YoZmllbGRUeXBlKSA9PSAtMSAmJiBbJ2lzIGJsYW5rJywgJ2lzIG5vdCBibGFuaycsICdpcyBudWxsJywgJ2lzIG5vdCBudWxsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpID09IC0xIC0tPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUsIGRpc2FibGU6ICRwYXJlbnQuT3BlcmF0b3IoKSA9PSAnaXMgZGVmYXVsdCcsYXR0cjoge2lkOiAnY3RsLScgKyAkZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1wYXJlbnRwcmVmaXhdJykuZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudHByZWZpeCcpICsgJy0nICsgdWlJZH1cIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IGhhc0ZvcmVpZ25LZXkgJiYgJHBhcmVudC5PcGVyYXRvcigpICE9ICdhbGwnIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IGhhc0ZvcmVpZ25QYXJlbnRLZXkgJiYgJHBhcmVudC5zaG93UGFyZW50RmlsdGVyKCkgLS0+XHJcbiAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgZHJvcGRvd25QYXJlbnQ6ICcjZmlsdGVyLScrdWlJZCwgcGxhY2Vob2xkZXI6ICdQbGVhc2UgQ2hvb3NlJywgYWxsb3dDbGVhcjogdHJ1ZSB9LCBvcHRpb25zOiAkcGFyZW50LlBhcmVudExpc3QsIG9wdGlvbnNUZXh0OiAndGV4dCcsIG9wdGlvbnNWYWx1ZTogJHBhcmVudC5Jc0NvbmRpdGlvbmFsRmlsdGVyID8gJ3RleHQnOiAnaWQnLCBzZWxlY3RlZE9wdGlvbnM6ICRwYXJlbnQuUGFyZW50SW5cIj48L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Lk9wZXJhdG9yKCk9PSc9Jy0tPlxyXG4gICAgICAgIDxzZWxlY3QgcmVxdWlyZWQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IGRyb3Bkb3duUGFyZW50OiAnI2ZpbHRlci0nK3VpSWQsIHBsYWNlaG9sZGVyOiAnUGxlYXNlIENob29zZScsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogJHBhcmVudC5Mb29rdXBMaXN0LCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICAgJHBhcmVudC5Jc0NvbmRpdGlvbmFsRmlsdGVyID8gJ3RleHQnOiAnaWQnLCB2YWx1ZTogJHBhcmVudC5WYWx1ZSwgb3B0aW9uc0NhcHRpb246ICdQbGVhc2UgQ2hvb3NlJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuT3BlcmF0b3IoKT09J2luJyB8fCAkcGFyZW50Lk9wZXJhdG9yKCk9PSdub3QgaW4nLS0+XHJcbiAgICAgICAgPHNlbGVjdCByZXF1aXJlZCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgZHJvcGRvd25QYXJlbnQ6ICcjZmlsdGVyLScrdWlJZCwgcGxhY2Vob2xkZXI6ICdQbGVhc2UgQ2hvb3NlJywgYWxsb3dDbGVhcjogdHJ1ZSB9LCBvcHRpb25zOiAkcGFyZW50Lkxvb2t1cExpc3QsIG9wdGlvbnNUZXh0OiAndGV4dCcsIG9wdGlvbnNWYWx1ZTogJHBhcmVudC5Jc0NvbmRpdGlvbmFsRmlsdGVyID8gJ3RleHQnOiAnaWQnLCBzZWxlY3RlZE9wdGlvbnM6ICRwYXJlbnQuVmFsdWVJblwiPjwvc2VsZWN0PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJwYWdlci10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhZ2VyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxyXG5cclxuICAgICAgICA8IS0tIFJvd3MgcGVyIHBhZ2UgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgbXMtMVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5QYWdlIHNpemU6PC9zcGFuPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc20gdy1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBwYWdlU2l6ZU9wdGlvbnMsIHZhbHVlOiBwYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBJbm5lciBib3JkZXIgYmxvY2sgZm9yIHBhZ2UgbmF2aWdhdGlvbiBjb250cm9scyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMSBtcy0zXCI+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJGaXJzdFwiIGRhdGEtYmluZD1cImNsaWNrOiBmaXJzdCwgZW5hYmxlOiAhaXNGaXJzdFBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gcGFnZXItYnRuIG1zLTFcIiBhcmlhLWxhYmVsPVwiRmlyc3QgUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3VibGUtbGVmdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIlByZXZpb3VzXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHByZXZpb3VzLCBlbmFibGU6ICFpc0ZpcnN0UGFnZSgpXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBwYWdlci1idG5cIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+UGFnZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIHBhdHRlcm49XCJbMC05XSpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSB0ZXh0LWNlbnRlciBwYWdlci1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNjBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiBjdXJyZW50UGFnZSwgYXR0cjogeyBtYXg6IHBhZ2VzKCkgfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+b2Y8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBwYWdlc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiTmV4dFwiIGRhdGEtYmluZD1cImNsaWNrOiBuZXh0LCBlbmFibGU6ICFpc0xhc3RQYWdlKClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIHBhZ2VyLWJ0blwiIGFyaWEtbGFiZWw9XCJOZXh0IFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJMYXN0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGxhc3QsIGVuYWJsZTogIWlzTGFzdFBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gcGFnZXItYnRuXCIgYXJpYS1sYWJlbD1cIkxhc3QgUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3VibGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcblxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtY29sdW1uLWhlYWRlclwiPlxyXG4gICAgPCEtLSBrbyBmb3JlYWNoOiBDb2x1bW5zIC0tPlxyXG4gICAgPHRoIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICFJc1Bpdm90RmllbGQgPyBmaWVsZElkIDogJ3Bpdm90LS0nICsgZmllbGROYW1lIH0sIHN0eWxlOiB7J3RleHQtYWxpZ24nOiBmaWVsZEFsaWduKCkgPyBmaWVsZEFsaWduKCkgOiAoSXNOdW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0JyksICdiYWNrZ3JvdW5kLWNvbG9yJzogaGVhZGVyQmFja0NvbG9yIH0sIGhpZGRlbjogb3V0ZXJHcm91cFwiIHN0eWxlPVwiYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7XCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJpZjogISRwYXJlbnQuSXNEcmlsbERvd24oKVwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4O1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcHVwXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwiZmFsc2VcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLXYgc29ydGFibGVcIiB0aXRsZT1cIkRyYWcgdG8gcmVvcmRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDx1bCBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhSXNQaXZvdEZpZWxkXCIgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgc3R5bGU9XCJ6LWluZGV4OiAxMDAxO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gc21hbGxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhSXNOdW1lcmljXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZU91dGVyR3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2xvbmVcIj48L3NwYW4+IE91dGVyIEdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogc2V0dXBGaWVsZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZ2VhclwiPjwvc3Bhbj4gRmllbGQgU2V0dGluZ3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J3dpZHRoJzogZmllbGRXaWR0aH1cIj5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudHNbM10udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MoKSA6ICgkcGFyZW50c1s1XS51c2VTdG9yZWRQcm9jID8gJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYygpIDogZmFsc2UpIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZExhYmVsKCkgPyBmaWVsZExhYmVsKCkgOiBmaWVsZE5hbWUsIHN0eWxlOiB7J2NvbG9yJzogaGVhZGVyRm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBoZWFkZXJGb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCd9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogJHBhcmVudHNbM10udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MoKSA6ICgkcGFyZW50c1s1XS51c2VTdG9yZWRQcm9jID8gJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYygpIDogZmFsc2UpICAtLT5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBpZiAoIUlzUGl2b3RGaWVsZCkgeyAkcGFyZW50c1twYWdlckluZGV4KCRwYXJlbnRzKV0uY2hhbmdlU29ydChTcWxGaWVsZCk7IH0gfSwgc3R5bGU6IHsnY29sb3InOiBoZWFkZXJGb250Q29sb3IsICdmb250LXdlaWdodCc6IGhlYWRlckZvbnRCb2xkKCkgPyAnYm9sZCcgOiAnbm9ybWFsJ31cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRwYXJlbnQuSXNEcmlsbERvd24oKSAmJiBmaWVsZExhYmVsMigpID8gZmllbGRMYWJlbDIoKSA6IChmaWVsZExhYmVsKCkgPyBmaWVsZExhYmVsKCkgOiBmaWVsZE5hbWUpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJHBhcmVudHNbcGFnZXJJbmRleCgkcGFyZW50cyldLnBhZ2VyLnNvcnRDb2x1bW4oKSA9PT0gU3FsRmllbGQgPyAoJHBhcmVudHNbcGFnZXJJbmRleCgkcGFyZW50cyldLnBhZ2VyLnNvcnREZXNjZW5kaW5nKCkgPyAnJiM5NjYwOycgOiAnJiM5NjUwOycpIDogJydcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RoPlxyXG4gICAgPCEtLSAva28gLS0+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtd2lkZ2V0XCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogMTAwJTtmb250LXNpemU6IDQ4cHhcIj5cclxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSb3dzLmxlbmd0aCA8IDFcIiB0aXRsZT1cIk5vIGRhdGEgZm91bmRcIj4vPC9zcGFuPlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBSb3dzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiAkcGFyZW50LnJvd3NbMF0uSXRlbXNbMF1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50LlJvd3MubGVuZ3RoID4gMSA/ICgkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uc2hvd1ByaW9ySW5LcGkgIT0gdW5kZWZpbmVkID8gJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLnNob3dQcmlvckluS3BpKCkgOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMV0uc2hvd1ByaW9ySW5LcGkoKSkgOiBmYWxzZSAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInN0eWxlOiB7J2NvbG9yJzogJHBhcmVudC5jYWxjdWxhdGVSYXRlKCkgPiAwID8gJ2dyZWVuJyA6ICdyZWQnLCAnZm9udC1zaXplJzogJzI0cHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6ICRwYXJlbnQuY2FsY3VsYXRlUmF0ZSgpICsgJyUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHsnZm9udC1zaXplJzogJzI0cHgnLCAnY29sb3InOiAnZ3JheSd9LCBjc3M6IHsndGV4dC1tdXRlZCc6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJpb3IgUGVyaW9kOiA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiAkcGFyZW50LlJvd3NbMV0uSXRlbXNbMF0uZm9ybWF0dGVkVmFsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWNvbHVtblwiPlxyXG4gICAgPCEtLSBrbyBmb3JlYWNoOiBJdGVtcyAtLT5cclxuICAgIDx0ZCBkYXRhLWJpbmQ9XCJoaWRkZW46IG91dGVyR3JvdXAsIHN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiBfYmFja0NvbG9yID8/IGJhY2tDb2xvcigpLCAnY29sb3InOiBfZm9udENvbG9yID8/IGZvbnRDb2xvcigpLCAnZm9udC13ZWlnaHQnOiBmb250Qm9sZCgpIHx8IF9mb250Qm9sZCA/ICdib2xkJyA6ICdub3JtYWwnLCAndGV4dC1hbGlnbic6IGZpZWxkQWxpZ24oKSA/IGZpZWxkQWxpZ24oKSA6IChDb2x1bW4uSXNOdW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0Jyl9XCI+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGggfSwgY3NzOiB7ICd0ZXh0LXdyYXAnOiBmaWVsZFdpZHRoIH1cIj5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogTGlua1RvLS0+XHJcbiAgICAgICAgICAgIDxhIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiBMaW5rVG99XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4gZGF0YS1iaW5kPVwiaHRtbDogZm9ybWF0dGVkVmFsXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogTGlua1RvLS0+XHJcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtcGl2b3RcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCIgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0RGF0YVwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZCBzdHlsZT1cInBvc2l0aW9uOiBzdGlja3k7IHRvcDogLTFweDsgei1pbmRleDogMjtcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IFJvd3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBJdGVtc1swXS5Gb3JtYXR0ZWRWYWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImZvcmVhY2g6IENvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkaW5kZXgoKSA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZExhYmVsIHx8IENvbHVtbk5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6ICRwYXJlbnQuUm93cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwic3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6ICRwYXJlbnQuYmFja0NvbG9yLCAnY29sb3InOiAkcGFyZW50LmZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogJHBhcmVudC5mb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCcsICd0ZXh0LWFsaWduJzogJHBhcmVudC5maWVsZEFsaWduID8gJHBhcmVudC5maWVsZEFsaWduIDogKCRwYXJlbnQuSXNOdW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0JykgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBJdGVtc1skcGFyZW50Q29udGV4dC4kaW5kZXgoKV0uRm9ybWF0dGVkVmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtdGFibGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkXCIgZGF0YS1iaW5kPVwiYXR0cjoge2NsYXNzOiAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWQgJyArICRwYXJlbnRzWzJdLnNlbGVjdGVkU3R5bGUoKX1cIj5cclxuICAgICAgICAgICAgPHRoZWFkIHN0eWxlPVwicG9zaXRpb246IHN0aWNreTsgdG9wOiAtMXB4OyB6LWluZGV4OiAyO1wiIGRhdGEtYmluZD1cImlmOiAhJHBhcmVudHNbMl0ubm9IZWFkZXJSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibm8taGlnaGxpZ2h0XCIgZGF0YS1iaW5kPVwic29ydGFibGVDb2x1bW5zOiB7IGhhbmRsZTogJy5zb3J0YWJsZScsIGN1cnNvcjogJ21vdmUnLCBwbGFjZWhvbGRlcjogJ2Ryb3AtaGlnaGxpZ2h0JyxzZWxlY3RlZEZpZWxkczogJHBhcmVudHNbMl0uU2VsZWN0ZWRGaWVsZHMgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgIUlzRHJpbGxEb3duKCkgJiYgIUNhbkV4cGFuZE9wdGlvbigpICYmICghJHBhcmVudHNbMl0uaGFzUGl2b3RDb2x1bW4oKSB8fCAoJHBhcmVudHNbMl0uaGFzUGl2b3RDb2x1bW4oKSAmJiAkcGFyZW50c1syXS5hcHBTZXR0aW5ncy51c2VBbHRQaXZvdCkpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMHB4OyBib3JkZXItbGVmdDogMXB4IHNvbGlkO1wiIGRhdGEtYmluZD1cInN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiBDb2x1bW5zWzBdLmhlYWRlckJhY2tDb2xvcn1cIj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uLWhlYWRlcicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAncmVwb3J0LXRhYmxlLWJvZHknICsgJHBhcmVudHNbMl0uUmVwb3J0SUQoKX1cIj5cclxuICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUm93cy5sZW5ndGggPCAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46IENvbHVtbnMubGVuZ3RoICsgMX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVjb3JkcyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICEkcGFyZW50c1syXS51c2VSZW5kZXJUYWJsZSgpIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiAkcGFyZW50LnJvd3MgIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgISRwYXJlbnQuSXNEcmlsbERvd24oKSAmJiAhJHBhcmVudC5DYW5FeHBhbmRPcHRpb24oKSAmJiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzBweDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogSXRlbXNbMF0uX2JhY2tDb2xvciA/PyBJdGVtc1swXS5iYWNrQ29sb3IoKSwgJ2NvbG9yJzogSXRlbXNbMF0uX2ZvbnRDb2xvciA/PyBJdGVtc1swXS5mb250Q29sb3IoKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdG9nZ2xlKCk7IH1cIj48c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiB7J2ZhLXBsdXMnOiAhaXNFeHBhbmRlZCgpLCAnZmEtbWludXMnOiBpc0V4cGFuZGVkKCl9XCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uJywgZGF0YTogJGRhdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc0V4cGFuZGVkIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMHB4O1wiPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46ICRwYXJlbnQuQ29sdW1ucy5sZW5ndGggfVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIURyaWxsRG93bkRhdGEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBEcmlsbERvd25EYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZFwiIGRhdGEtYmluZD1cIndpdGg6IERyaWxsRG93bkRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJuby1oaWdobGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogJ3JlcG9ydC1jb2x1bW4taGVhZGVyJywgZGF0YTogJGRhdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSb3dzICYmIFJvd3MubGVuZ3RoIDwgMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwiYXR0cjoge2NvbHNwYW46IENvbHVtbnMubGVuZ3RofVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVjb3JkcyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBSb3dzICAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uJywgZGF0YTogJGRhdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLWNlbnRlcmVkXCIgZGF0YS1iaW5kPVwid2l0aDogcGFnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZSBzbWFsbCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogcGFnZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnVG90YWwgUmVjb3JkczogJyArIHRvdGFsUmVjb3JkcygpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIkRvd25sb2FkIEV4Y2VsXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuZXhwb3J0RXhjZWxcIj48c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiVmlldyBDb2RlXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI3NxbERyaWxsRG93bk1vZGFsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHJvb3QuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvZGVcIj48L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+ICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBwYWdlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBzdWJSZXBvcnRzUmFuKCkubGVuZ3RoID4gMCAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwiYXR0cjp7Y29sc3BhbjogJHBhcmVudC5Db2x1bW5zLmxlbmd0aCB9XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBzdWJSZXBvcnRzUmFuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDIwcHg7XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBSZXBvcnROYW1lXCI+PC9oMj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1vdmVyZmxvdy1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMDsgbWFyZ2luLXRvcDogMDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydERlc2NyaXB0aW9uLCB2aXNpYmxlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydFJlc3VsdFwiIGNsYXNzPVwic21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFSZXBvcnREYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCIgZGF0YS1iaW5kPVwid2l0aDogcGFnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiIGRhdGEtYmluZD1cImlmOiB0b3RhbFJlY29yZHMoKT4xICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICdUb3RhbCBSZWNvcmRzOiAnICsgdG90YWxSZWNvcmRzKClcIj48L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1yaWdodFwiIGRhdGEtYmluZD1cImlmOiBwYWdlcygpPjEgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3BhZ2VyLXRlbXBsYXRlJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudENvbnRleHQuJHBhcmVudC5TdWJUb3RhbHMoKS5sZW5ndGggPT0gMSAmJiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50Lk91dGVyR3JvdXBDb2x1bW5zKCkubGVuZ3RoID09IDAgLS0+XHJcbiAgICAgICAgICAgIDx0Zm9vdCBkYXRhLWJpbmQ9XCJmb3JlYWNoOiAkcGFyZW50Q29udGV4dC4kcGFyZW50LlN1YlRvdGFsc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic3ViLXRvdGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudC5jYW5EcmlsbGRvd24oKSAmJiAhJHBhcmVudC5Jc0RyaWxsRG93bigpICYmICEkcGFyZW50LkNhbkV4cGFuZE9wdGlvbigpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogSXRlbXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogVmFsdWUgIT0gJ05BJyAmJiBWYWx1ZSAhPSAnTmFOJyAmJiAhb3V0ZXJHcm91cCgpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogX2JhY2tDb2xvciA/PyBiYWNrQ29sb3IoKSwgJ2NvbG9yJzogX2ZvbnRDb2xvciA/PyBmb250Q29sb3IoKSwgJ2ZvbnQtd2VpZ2h0JzogZm9udEJvbGQoKSB8fCBfZm9udEJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJywgJ3RleHQtYWxpZ24nOiBmaWVsZEFsaWduKCkgPyBmaWVsZEFsaWduKCkgOiAncmlnaHQnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J3dpZHRoJzogZmllbGRXaWR0aCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGZvb3Q+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1yZW5kZXJcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0RGF0YVwiPlxyXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IFJvd3NcIj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImh0bWw6IHJlbmRlcmVkSHRtbCwgY3NzOiB7ICdjYXJkLXZpZXcnOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMV0uY2FyZFZpZXcgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IHN1YlJlcG9ydHNSYW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDIwcHg7XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInB1bGwtbGVmdFwiIGRhdGEtYmluZD1cInRleHQ6IFJlcG9ydE5hbWVcIj48L2gyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1vdmVyZmxvdy1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMDsgbWFyZ2luLXRvcDogMDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgZGF0YS1iaW5kPVwiaHRtbDogUmVwb3J0RGVzY3JpcHRpb24sIHZpc2libGU6IFJlcG9ydERlc2NyaXB0aW9uXCI+PC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFSZXBvcnREYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGxcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1sZWZ0IHRvdGFsLXJlY29yZHNcIiBkYXRhLWJpbmQ9XCJpZjogdG90YWxSZWNvcmRzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICdUb3RhbCBSZWNvcmRzOiAnICsgdG90YWxSZWNvcmRzKClcIj48L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJpZjogcGFnZXMoKT4xICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3BhZ2VyLXRlbXBsYXRlJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtY2hhcnRcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7aWQ6ICdjaGFydF9kaXZfJyArICRwYXJlbnQuUmVwb3J0SUQoKX0sIHZpc2libGU6ICRwYXJlbnQuaXNDaGFydFwiPjwvZGl2PlxyXG4gICAgPCEtLSBrbyBpZjogJHBhcmVudC5SZXBvcnRUeXBlKCkgPT0gJ1Bpdm90JyAtLT5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LXBpdm90JywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG4gICAgPCEtLSAva28gLS0+XHJcblxyXG4gICAgPCEtLSBrbyBpZjogJHBhcmVudC5SZXBvcnRUeXBlKCkgPT0gJ0h0bWwnIC0tPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtcmVuZGVyJywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG4gICAgPCEtLSAva28gLS0+XHJcblxyXG4gICAgPCEtLSBrbyBpZjogJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1Bpdm90JyAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnSHRtbCcgJiYgKCEkcGFyZW50LmlzQ2hhcnQoKSB8fCAkcGFyZW50LlNob3dEYXRhV2l0aEdyYXBoKCkpIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5PdXRlckdyb3VwQ29sdW1ucygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwiZmFsc2VcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgTWFuYWdlIEdyb3VwcyA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLXZcIj48L3NwYW4+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBzdHlsZT1cInotaW5kZXg6IDEwMDE7XCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogJHBhcmVudC5PdXRlckdyb3VwQ29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiByZW1vdmVcIiB0aXRsZT1cIlJlbW92ZSBmcm9tIEdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jbG9zZVwiPjwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGROYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjbGVhci1maXhcIj48L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IG91dGVyR3JvdXBEYXRhXCI+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogcm93cy5sZW5ndGggPiAwIHx8ICgkcGFyZW50Lm91dGVyR3JvdXBEYXRhICYmICRwYXJlbnQub3V0ZXJHcm91cERhdGEoKS5sZW5ndGggPT0gMSkgLS0+XHJcbiAgICAgICAgPGg2IGRhdGEtYmluZD1cImh0bWw6IGRpc3BsYXlcIj48L2g2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA1cHg7XCI+PC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWzFdLlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJy0tPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LXRhYmxlJywgZGF0YTogJHBhcmVudC5SZXBvcnREYXRhIH1cIj48L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50c1sxXS5SZXBvcnRUeXBlKCkgPT0gJ1NpbmdsZSctLT5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC13aWRnZXQnLCBkYXRhOiAkcGFyZW50LlJlcG9ydERhdGEgfVwiPjwvZGl2PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIC9rbyAtLT5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiYWRtaW4tbW9kZS10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogMTBweDtcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIGQtaW5saW5lLWJsb2NrXCIgc3R5bGU9XCJmb250LXNpemU6IDEwcHQ7IHBhZGRpbmc6IDVweDsgbWF4LXdpZHRoOiAzNTBweDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgbWFyZ2luLWJvdHRvbTogMDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXVzZXItY2lyY2xlXCI+PC9pPiBZb3UgY2FuIG1hbmFnZSBSZXBvcnRzL0Rhc2hib2FyZHMgZm9yIGFsbCB1c2Vyc1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1YmJsZS1iYWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEFkbWluIE1vZGVcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBtcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBhZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlXCI+XHJcbiAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1rZXlcIj48L3NwYW4+TWFuYWdlIEFjY2VzczwvaDU+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1ib2R5XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDtcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS0zIGNvbnRyb2wtbGFiZWxcIj5DbGllbnQgSWQgdG8gUmVzdHJpY3QgQWNjZXNzPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1ib3ggc2luZ2xlLWxpbmVcIiB0eXBlPVwidGV4dFwiIGRhdGEtYmluZD1cInZhbHVlOiBjbGllbnRJZFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC1zbS0xXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCIgY2xhc3M9XCJmYSBmYS1xdWVzdGlvbi1jaXJjbGUgaGVscHRpcFwiIHRpdGxlPVwiTGVhdmUgYmxhbmsgdG8gZ2l2ZSBhbGwgY2xpZW50cyBhY2Nlc3MgKEdsb2JhbCBSZXBvcnRzKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItbyBmYS0yeFwiPjwvc3Bhbj4mbmJzcDtVc2VyIGxldmVsIHJpZ2h0cyBvdmVycmlkZSBSb2xlIGxldmVsIHJpZ2h0cy4gTm8gc2VsZWN0aW9uIGZvciBhIHJ1bGUgaW1wbGllcyByZXBvcnQgaXMgYXZhaWxhYmxlIHRvIGFsbC5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlTWFuYWdlVXNlcnMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93TWFuYWdlVXNlcnMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd01hbmFnZVVzZXJzKCkgfVwiPjwvaT4gPGI+TWFuYWdlIGJ5IFVzZXI8L2I+IChhbGxvdyBlZGl0KVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93TWFuYWdlVXNlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVXNlcnMoKS5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZ3JvdXBlZFVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHNob3coIXNob3coKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSB0b2dnbGUtaWNvblwiIGRhdGEtYmluZD1cImNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvdygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93KCkgfVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBkYXRhLWJpbmQ9XCJ0ZXh0OiBjYXRlZ29yeVwiPjwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB1c2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4gJm5ic3A7IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7IDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGdyb3VwZWRVc2VycygpLmxlbmd0aCA9PSAwICYmIHVzZXJzLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB1c2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBncm91cGVkVXNlcnMoKS5sZW5ndGggPT0gMCAmJiB1c2Vycy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZVZpZXdVc2Vycyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dWaWV3VXNlcnMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd1ZpZXdVc2VycygpIH1cIj48L2k+IDxiPlZpZXcgb25seSBieSBVc2VyPC9iPiAobm8gZWRpdC9kZWxldGUpXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dWaWV3VXNlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVmlld09ubHlVc2VycygpLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBncm91cGVkVmlld09ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzaG93KCFzaG93KCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgdG9nZ2xlLWljb25cIiBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3coKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvdygpIH1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlcIj48L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdmlld09ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4gJm5ic3A7IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7IDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGdyb3VwZWRWaWV3T25seVVzZXJzKCkubGVuZ3RoID09IDAgJiYgdmlld09ubHlVc2Vycy5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdmlld09ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBncm91cGVkVmlld09ubHlVc2VycygpLmxlbmd0aCA9PSAwICYmIHVzZXJzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IGlzRGFzaGJvYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0b2dnbGUtaWNvbiBmYVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVEZWxldGVVc2Vycyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dEZWxldGVVc2VycygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93RGVsZXRlVXNlcnMoKSB9XCI+PC9pPjxiPkRlbGV0ZSBieSBVc2VyPC9iPiAoYWxsb3cgZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd0RlbGV0ZVVzZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZERlbGV0ZU9ubHlVc2VycygpLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBncm91cGVkRGVsZXRlT25seVVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHNob3coIXNob3coKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSB0b2dnbGUtaWNvblwiIGRhdGEtYmluZD1cImNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvdygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93KCkgfVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBkYXRhLWJpbmQ9XCJ0ZXh0OiBjYXRlZ29yeVwiPjwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBkZWxldGVPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+ICZuYnNwOyA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwOyA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkRGVsZXRlT25seVVzZXJzKCkubGVuZ3RoID09IDAgJiYgZGVsZXRlT25seVVzZXJzLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBkZWxldGVPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGdyb3VwZWREZWxldGVPbmx5VXNlcnMoKS5sZW5ndGggPT0gMCAmJiAgdXNlcnMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZU1hbmFnZVJvbGVzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd01hbmFnZVJvbGVzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dNYW5hZ2VSb2xlcygpIH1cIj48L2k+PGI+TWFuYWdlIGJ5IFVzZXIgUm9sZTwvYj4gKGFsbG93IGVkaXQpXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dNYW5hZ2VSb2xlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdXNlclJvbGVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHVzZXJSb2xlcy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VyIFJvbGVzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlVmlld1JvbGVzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd1ZpZXdSb2xlcygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93Vmlld1JvbGVzKCkgfVwiPjwvaT48Yj5WaWV3IG9ubHkgYnkgVXNlciBSb2xlPC9iPiAobm8gZWRpdC9kZWxldGUpXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dWaWV3Um9sZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHZpZXdPbmx5VXNlclJvbGVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHVzZXJSb2xlcy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VyIFJvbGVzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OiBpc0Rhc2hib2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRGVsZXRlUm9sZXMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93RGVsZXRlUm9sZXMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd0RlbGV0ZVJvbGVzKCkgfVwiPjwvaT48Yj5EZWxldGUgYnkgVXNlciBSb2xlPC9iPiAoYWxsb3cgZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd0RlbGV0ZVJvbGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZGVsZXRlT25seVVzZXJSb2xlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4mbmJzcDs8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VyUm9sZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgUm9sZXMgbGlzdCBub3QgcG9wdWxhdGVkIG9yIG5vdCBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImZpbHRlci1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXIgZm9ybS1pbmxpbmVcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBGaWx0ZXJHcm91cHNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXMtZ3JvdXAtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlcy1ncm91cC1oZWFkZXJcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7cGFyZW50ZGl2aWQ6IGdlbmVyYXRlVW5pcXVlSWQoKX1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIWlzUm9vdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtdG9nZ2xlIGJ0bi1ncm91cC1zbVwiIGRhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uc1wiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBhY3RpdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBkYXRhLWJpbmQ9XCJhdHRyOiB7IG5hbWU6ICdhbmRPckdyb3VwLScgKyAkZWxlbWVudC5jbG9zZXN0KCcucnVsZXMtZ3JvdXAtaGVhZGVyJykuZ2V0QXR0cmlidXRlKCdwYXJlbnRkaXZpZCcpIH0sIGNoZWNrZWQ6IEFuZE9yXCIgdmFsdWU9XCJBbmRcIiAvPiBBbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBkYXRhLWJpbmQ9XCJhdHRyOiB7IG5hbWU6ICdhbmRPckdyb3VwLScgKyAkZWxlbWVudC5jbG9zZXN0KCcucnVsZXMtZ3JvdXAtaGVhZGVyJykuZ2V0QXR0cmlidXRlKCdwYXJlbnRkaXZpZCcpIH0sIGNoZWNrZWQ6IEFuZE9yXCIgdmFsdWU9XCJPclwiIC8+IE9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuUmVtb3ZlRmlsdGVyR3JvdXAsIHZpc2libGU6ICFpc1Jvb3RcIj5SZW1vdmUgR3JvdXA8L2J1dHRvbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc1Jvb3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0IHBhZGRlZC1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiAmbmJzcDtGaWx0ZXIgQ29uZGl0aW9uczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlcy1ncm91cC1ib2R5XCIgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLWlubmVyJ31cIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJmbHktZmlsdGVyLXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiIGRhdGEtYmluZD1cInZpc2libGU6IEZseUZpbHRlcnMoKS5sZW5ndGg+MCB8fCBEb250RXhlY3V0ZU9uUnVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxhIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7J2RhdGEtYnMtdGFyZ2V0JzogJyNmaWx0ZXItcGFuZWwtJyArIFJlcG9ydElEKCkgfVwiIGhyZWY9XCIjXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbHRlclwiPjwvaT4gQ2hvb3NlIEZpbHRlcnNcclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAnZmlsdGVyLXBhbmVsLScgKyBSZXBvcnRJRCgpIH0sIGNzczoge2NvbGxwYXNlZDogIURvbnRFeGVjdXRlT25SdW4oKSwgY29sbGFwc2U6ICFEb250RXhlY3V0ZU9uUnVuKCl9XCIgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogRmx5RmlsdGVycyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTUgY29sLXhzLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiIGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHRpdGxlPVwiQXBwbHkgdGhpcyBmaWx0ZXJcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiAkcGFyZW50LkFwcGx5LCBkaXNhYmxlZDogZm9yY2VkXCIgLz4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRGaWx0ZXJOYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiIGNsYXNzPVwiY29sLXNtLTIgY29sLXhzLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5BcHBseVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogZmllbGRGaWx0ZXIsIHZhbHVlOiAkcGFyZW50Lk9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBjbGFzcz1cImNvbC1zbS01IGNvbC14cy01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuQXBwbHlcIiBkYXRhLXBhcmVudHByZWZpeD1cIkZcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWZpbHRlcicsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogRXhlY3V0ZVJlcG9ydFwiPlJ1bjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZmlsdGVyLWlubmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicnVsZXMtbGlzdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJydWxlLWNvbnRhaW5lclwiIGRhdGEtYmluZD1cInZpc2libGU6IEZpbHRlcnMoKS5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWJvcmRlcmxlc3NcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5GaWVsZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5GaWx0ZXI8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImZvcmVhY2g6IEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJydWxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgZGF0YS1iaW5kPVwidmFsdWU6IEFuZE9yLCB2aXNpYmxlOiAkaW5kZXgoKT4wXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkFuZDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPk9yPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uc2VsZWN0ZWRGaWVsZHNDYW5GaWx0ZXIgIT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5zZWxlY3RlZEZpZWxkc0NhbkZpbHRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMV0uc2VsZWN0ZWRGaWVsZHNDYW5GaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDYXB0aW9uOiAnUGxlYXNlIENob29zZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7cmVxdWlyZWQ6IEZpZWxkKCk9PW51bGw/J3JlcXVpcmVkJzpmYWxzZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBGaWVsZCgpICYmIEZpZWxkKCkuZm9yY2VkXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogZmllbGRGaWx0ZXIsIHZhbHVlOiAkcGFyZW50Lk9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJNXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtZmlsdGVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBGaWVsZCgpICYmIEZpZWxkKCkuZmllbGRUeXBlID09ICdEYXRlVGltZScgJiYgT3BlcmF0b3IoKSA9PSAncmFuZ2UnICYmICRpbmRleCgpPT0wIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5jYW5BZGRTZXJpZXMgIT0gdW5kZWZpbmVkICYmICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5jYW5BZGRTZXJpZXMoKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5BZGRTZXJpZXMuYmluZCgkZGF0YSlcIj5BZGQgQ29tcGFyaXNvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0va28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLmNhbkFkZFNlcmllcyA9PSB1bmRlZmluZWQgJiYgJHBhcmVudENvbnRleHQuJHBhcmVudC5jYW5BZGRTZXJpZXMgIT0gdW5kZWZpbmVkICYmICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuQWRkU2VyaWVzKCktLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuQWRkU2VyaWVzLmJpbmQoJGRhdGEpXCI+QWRkIENvbXBhcmlzb248L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0va28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogRmllbGQoKSAmJiBGaWVsZCgpLmZvcmNlZFwiIGNsYXNzPVwiYmFkZ2UgYmctaW5mb1wiPlJlcXVpcmVkIEZpbHRlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgc3R5bGU9XCJmbGV4LWdyb3c6IDE7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuUmVtb3ZlRmlsdGVyLCBoaWRkZW46IEZpZWxkKCkgJiYgRmllbGQoKS5mb3JjZWRcIiB0aXRsZT1cIlJlbW92ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgc3R5bGU9XCJmbGV4LWdyb3c6IDE7XCIgZGF0YS1iaW5kPVwid2l0aDogRmllbGQsIGhpZGRlbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpbHRlci1wYW5lbC5jYXJkLWJvZHkuY29sbGFwc2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4gYnRuLXNtXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IGZpbHRlck9uRmx5KCFmaWx0ZXJPbkZseSgpKTsgfSwgY3NzOiB7J2J0bi1zdWNjZXNzJzogZmlsdGVyT25GbHkoKT09dHJ1ZSwgJ2J0bi1zZWNvbmRhcnknOiBmaWx0ZXJPbkZseSgpPT1mYWxzZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbHRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRmlsdGVyIG9uIFJlcG9ydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGNvbXBhcmVUbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudHNbMl0uUmVtb3ZlU2VyaWVzXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaC1vXCI+PC9zcGFuPjwvYnV0dG9uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm11dGVkXCI+Q29tcGFyZSB0bzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogUmFuZ2UsIHZhbHVlOiBWYWx1ZVwiIHJlcXVpcmVkPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJydWxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2ZpbHRlci1ncm91cCd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogQWRkRmlsdGVyXCI+QWRkIEZpbHRlcjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IEFkZEZpbHRlckdyb3VwXCI+QWRkIEZpbHRlciBHcm91cDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImZpbHRlci1wYXJhbWV0ZXJzXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImhpZGRlbjogc2hvd1BhcmFtZXRlcnNcIj5ObyBmaWx0ZXJzIGF2YWlsYWJsZSB0byBjaG9vc2U8L3NwYW4+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1ib3JkZXJsZXNzXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd1BhcmFtZXRlcnNcIj5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCVcIj5GaWx0ZXI8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAyMCVcIj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCVcIj5WYWx1ZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgZGF0YS1iaW5kPVwiZm9yZWFjaDogUGFyYW1ldGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGRhdGEtYmluZD1cImlmbm90OiBIaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwidGV4dDogRGlzcGxheU5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogb3BlcmF0b3JzLCB2YWx1ZTogT3BlcmF0b3JcIiByZXF1aXJlZD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBkYXRhLXBhcmVudHByZWZpeD1cIlBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1maWx0ZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtc2NoZWR1bGVcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogc2NoZWR1bGVCdWlsZGVyXCIgaWQ9XCJzY2hlZHVsZS1idWlsZGVyLWRpdlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoYXNTY2hlZHVsZVwiIGlkPVwic2NoZWR1bGVSZXBvcnRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2NoZWR1bGVSZXBvcnRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgU2V0IFNjaGVkdWxlIHRvIHNlbmQgYnkgRW1haWxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBoYXNTY2hlZHVsZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkT3B0aW9uKCkgIT0gJ29uY2UnID8gJ0V2ZXJ5ICcgOiAnJ1wiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiBvcHRpb25zLCB2YWx1ZTogc2VsZWN0ZWRPcHRpb25cIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogc2VsZWN0ZWRPcHRpb24oKSA9PSAnb25jZSdcIiBjbGFzcz1cIm1lLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICZuYnNwO29uJm5ic3A7PGlucHV0IGRhdGEtYmluZD1cImRhdGVwaWNrZXI6IHNlbGVjdGVkRGF0ZSwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogc2VsZWN0ZWREYXRlfVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93RGF5c1wiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtvbiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG11bHRpcGxlIGNsYXNzPVwiZm9ybS1zZWxlY3QgbXMtMlwiIHJlcXVpcmVkIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgcGxhY2Vob2xkZXI6ICdDaG9vc2UgRGF5cycsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogZGF5cywgc2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZERheXNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93RGF0ZXNcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7b24mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwic2VsZWN0MjogeyBwbGFjZWhvbGRlcjogJ0Nob29zZSBEYXRlcycsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogZGF0ZXMsIHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWREYXRlc1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNob3dNb250aHNcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7b24mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwic2VsZWN0MjogeyBwbGFjZWhvbGRlcjogJ0Nob29zZSBNb250aHMnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6IG1vbnRocywgc2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZE1vbnRoc1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNob3dBdFRpbWVcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDthdCZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgbWUtMlwiIHN0eWxlPVwibWluLXdpZHRoOiA2MHB4O1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGhvdXJzLCB2YWx1ZTogc2VsZWN0ZWRIb3VyXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBtZS0yXCIgc3R5bGU9XCJtaW4td2lkdGg6IDYwcHg7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogbWludXRlcywgdmFsdWU6IHNlbGVjdGVkTWludXRlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MHB4O1wiIGRhdGEtYmluZD1cInZhbHVlOiBzZWxlY3RlZEFtUG1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+QU08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+UE08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUmVwb3J0IHdpbGwgYmUgcnVuIGFuZCBlbWFpbGVkIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkT3B0aW9uKCkgIT0gJ29uY2UnID8gJ2V2ZXJ5JyA6ICcnXCI+PC9zcGFuPiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE9wdGlvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzZWxlY3RlZE9wdGlvbigpID09ICdvbmNlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIG9uIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhc2VsZWN0ZWREYXRlKClcIj5QbGVhc2UgcGljayBhIERhdGU8L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkRGF0ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93RGF5c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIG9uIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWxlY3RlZERheXMoKS5sZW5ndGggPT0gMFwiPlBsZWFzZSBwaWNrIERheShzKTwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWREYXlzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwiaWY6IHNob3dEYXRlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIG9uIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWxlY3RlZERhdGVzKCkubGVuZ3RoID09IDBcIj5QbGVhc2UgcGljayBEYXRlKHMpPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImZvcmVhY2g6IHNlbGVjdGVkRGF0ZXNcIj48c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkaW5kZXgoKT4wXCI+LCA8L3NwYW4+PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJGRhdGEgPT0gMSA/ICcxc3QnOiAoJGRhdGEgPT0gMiA/ICcybmQnIDogKCRkYXRhID09IDMgPyAnM3JkJyA6ICgkZGF0YSA9PSAzMSA/ICczMXN0JyA6ICRkYXRhKyd0aCcpKSlcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwiaWY6IHNob3dNb250aHNcIj5cclxuICAgICAgICAgICAgICAgICAgICBvZiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWRNb250aHMoKS5sZW5ndGggPT0gMFwiPlBsZWFzZSBwaWNrIE1vbnRoKHMpPC9zcGFuPiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE1vbnRoc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93QXRUaW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgYXQgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRIb3VyXCI+PC9zcGFuPjo8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE1pbnV0ZVwiPjwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRBbVBtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj5FbWFpbCB0bzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGVtYWlsVG9cIiBwbGFjZWhvbGRlcj1cIkVudGVyIEVtYWlsIEFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWEgdG8gc2VuZCB0aGUgUmVwb3J0IHRvXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMSBjb2wtZm9ybS1sYWJlbFwiPkZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtYXQsZXZlbnQ6IHsgY2hhbmdlOiBvbkZvcm1hdENoYW5nZSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiRVhDRUxcIj5FeGNlbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmNhbkRyaWxsZG93biAmJiAkcGFyZW50LmNhbkRyaWxsZG93bigpXCIgdmFsdWU9XCJFWENFTC1TVUJcIj5FeGNlbCAoRXhwYW5kZWQpPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ1NWXCI+Q1NWPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUERGXCI+UERGPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiV09SRFwiPldvcmQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJMSU5LXCI+TGluazwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj5QaWNrIFRpbWUgWm9uZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IHRpbWV6b25PcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnZGlzcGxheU5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd0aW1lWm9uZUlkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVGltZXpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDI6IHtkcm9wZG93blBhcmVudDogJCgnI3NjaGVkdWxlLWJ1aWxkZXItZGl2JyksIGFsbG93Q2xlYXI6IHRydWUsIHBsYWNlaG9sZGVyOiAnU2V0IGEgdGltZSB6b25lIHRvIHNlbmQgcmVwb3J0J31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIHRpdGxlPVwiU2V0IGEgZGF0ZSB0byBzdGFydCBzZW5kaW5nIHNjaGVkdWxlZCByZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoYXNTY2hlZHVsZVN0YXJ0XCIgaWQ9XCJzY2hlZHVsZVN0YXJ0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzY2hlZHVsZVN0YXJ0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZSBTdGFydCBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIiBkYXRhLWJpbmQ9XCJpZjogaGFzU2NoZWR1bGVTdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cImRhdGVwaWNrZXI6IHNjaGVkdWxlU3RhcnQsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6IHNjaGVkdWxlU3RhcnR9XCIgdGl0bGU9XCJTY2hlZHVsZWQgUmVwb3J0IHdpbGwgbm90IGJlIHNlbnQgYmVmb3JlIHRoaXMgZGF0ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIHRpdGxlPVwiU2V0IGEgZGF0ZSB0byBzdG9wIHNlbmRpbmcgc2NoZWR1bGVkIHJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGhhc1NjaGVkdWxlRW5kXCIgaWQ9XCJzY2hlZHVsZUVuZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2NoZWR1bGVFbmRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlIEVuZCBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIiBkYXRhLWJpbmQ9XCJpZjogaGFzU2NoZWR1bGVFbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiBzY2hlZHVsZUVuZCwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogc2NoZWR1bGVFbmR9XCIgdGl0bGU9XCJTY2hlZHVsZWQgUmVwb3J0IHdpbGwgbm90IGJlIHNlbnQgYWZ0ZXIgdGhpcyBkYXRlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtZmllbGQtb3B0aW9uc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWF4LXdpZHRoOiA3NTBweDtcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IGVkaXRGaWVsZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj48c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZE5hbWVcIj48L3NwYW4+IC0gU2V0dXAgQWRkaXRpb25hbCBGaWVsZCBPcHRpb25zPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG5lZWRzLXZhbGlkYXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxiPkNvbHVtbiBGb3JtYXQgU2V0dGluZ3M8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIERhdGEgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBbJ0RheXMnLCAnSG91cnMnLCAnTWludXRlcycsICdTZWNvbmRzJ10uaW5kZXhPZihmaWVsZEZvcm1hdCgpKSA+PSAwID8gWydEYXlzJywgJ0hvdXJzJywgJ01pbnV0ZXMnLCAnU2Vjb25kcyddIDogJHBhcmVudHNbMV0uZmllbGRGb3JtYXRUeXBlcywgdmFsdWU6IGZpZWxkRm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnRzWzFdLmRlY2ltYWxGb3JtYXRUeXBlcy5pbmRleE9mKCRkYXRhLmZpZWxkRm9ybWF0KCkpPj0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIERlY2ltYWwgUGxhY2VzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGRlY2ltYWxQbGFjZXNcIiBwbGFjZWhvbGRlcj1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZpZWxkRm9ybWF0KCk9PSdDdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlBpY2sgQ3VycmVuY3kgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50c1sxXS5jdXJyZW5jeUZvcm1hdHMsIG9wdGlvbnNUZXh0OiAnZGlzcGxheScsb3B0aW9uc1ZhbHVlOiAndmFsdWUnLCB2YWx1ZTogY3VycmVuY3lGb3JtYXRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZmllbGRGb3JtYXQoKT09J0RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIERhdGUgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50c1sxXS5kYXRlRm9ybWF0cywgdmFsdWU6IGRhdGVGb3JtYXRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTpzZWxlY3RlZEFnZ3JlZ2F0ZSgpPT0nUGl2b3QnICYmIGZpZWxkRm9ybWF0KCk9PSdEYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGl2b3QgRHJpbGxkb3duIERhdGUgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBbJycsICdEYXknLCAnTW9udGgnLCAnWWVhcicsICdNb250aC9ZZWFyJ10sIHZhbHVlOiBkcmlsbERhdGFGb3JtYXRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZpZWxkRm9ybWF0KCk9PSdEYXRlJyAmJiBkYXRlRm9ybWF0KCk9PT0nQ3VzdG9tJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+RW50ZXIgQ3VzdG9tIERhdGUgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBjdXN0b21EYXRlRm9ybWF0XCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5DaG9vc2UgQ29sdW1uIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBmaWVsZExhYmVsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5Jbm5lciBDb2x1bW4gTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZpZWxkTGFiZWwyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5DaG9vc2UgVGV4dCBBbGlnbm1lbnQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6ICRwYXJlbnRzWzFdLmZpZWxkQWxpZ25tZW50cywgdmFsdWU6IGZpZWxkQWxpZ25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5DaG9vc2UgV2lkdGggKGxlYXZlIGJsYW5rIGZvciBhdXRvKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZmllbGRXaWR0aFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5IZWFkZXIgU2V0dGluZ3M8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaWNrIFRleHQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogMzhweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGhlYWRlckZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBoZWFkZXJGb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsSGVhZGVyRm9udENvbG9yKCFhcHBseUFsbEhlYWRlckZvbnRDb2xvcigpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxIZWFkZXJGb250Q29sb3IoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBCYWNrZ3JvdW5kIENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBoZWFkZXJCYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyQmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiQXBwbHkgdG8gYWxsIGNvbHVtbnNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXthcHBseUFsbEhlYWRlckJhY2tDb2xvcighYXBwbHlBbGxIZWFkZXJCYWNrQ29sb3IoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGFwcGx5QWxsSGVhZGVyQmFja0NvbG9yKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoZWFkZXJGb250Qm9sZFwiIGlkPVwiaGVhZGVyRm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJoZWFkZXJGb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxIZWFkZXJCb2xkKCFhcHBseUFsbEhlYWRlckJvbGQoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEhlYWRlckJvbGQoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5UZXh0IFNldHRpbmdzPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBUZXh0IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxGb250Q29sb3IoIWFwcGx5QWxsRm9udENvbG9yKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEZvbnRDb2xvcigpID8gJ2ZhLWNoZWNrJyA6ICdmYS1wYXN0ZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaWNrIEJhY2tncm91bmQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogMzhweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGJhY2tDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogYmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiQXBwbHkgdG8gYWxsIGNvbHVtbnNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXthcHBseUFsbEJhY2tDb2xvcighYXBwbHlBbGxCYWNrQ29sb3IoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGFwcGx5QWxsQmFja0NvbG9yKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBmb250Qm9sZFwiIGlkPVwiZm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxCb2xkKCFhcHBseUFsbEJvbGQoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEJvbGQoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFkZGVkLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2FkZENvbmRpdGlvbmFsRm9ybWF0U2V0dGluZyhudWxsKX1cIj5BZGQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IGZpZWxkQ29uZHRpb25hbEZvcm1hdHNcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogNDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNvbmRpdGlvbmFsIEZvcm1hdCAjPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJGluZGV4KCkrMVwiPjwvc3Bhbj48L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQucmVtb3ZlU2V0dGluZ1wiPlJlbW92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBUZXh0IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogMzhweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgQmFja2dyb3VuZCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBiYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBiYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogZm9udEJvbGRcIiBpZD1cImZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTJcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBmaWx0ZXIuRmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBmaWVsZEZpbHRlciwgdmFsdWU6ICRwYXJlbnQuT3BlcmF0b3JcIiByZXF1aXJlZD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBkYXRhLXBhcmVudHByZWZpeD1cIkNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1maWx0ZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cImlmOiAkcGFyZW50c1sxXS51c2VTdG9yZWRQcm9jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBwdWxsLWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA1cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGNoZWNrT3V0ZXJHcm91cFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0ZXIgR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNhbmNlbEZpZWxkT3B0aW9uc1wiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUZpZWxkT3B0aW9uc1wiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWxpbmstZWRpdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWF4LXdpZHRoOiA3NTBweDtcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IGVkaXRMaW5rRmllbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5TZXR1cCBMaW5rIEZpZWxkPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG5lZWRzLXZhbGlkYXRpb25cIiBkYXRhLWJpbmQ9XCJ3aXRoOiBsaW5rRmllbGRJdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+VGhpcyBmaWVsZCB3aWxsIGxpbmsgdG88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiBsaW5rVHlwZXMsIHZhbHVlOiBzZWxlY3RlZExpbmtUeXBlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IExpbmtzVG9SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkxpbmsgdG8gdGhpcyBSZXBvcnQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkIGRhdGEtYmluZD1cIm9wdGlvbnM6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuU2F2ZWRSZXBvcnRzLCBvcHRpb25zVGV4dDogJ3JlcG9ydE5hbWUnLCBvcHRpb25zVmFsdWU6ICdyZXBvcnRJZCcsIHZhbHVlOiBMaW5rZWRUb1JlcG9ydElkLCBvcHRpb25zQ2FwdGlvbjogJ0Nob29zZSB0aGUgUmVwb3J0IHRvIGxpbmsgdG8nXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImlmOiBMaW5rZWRUb1JlcG9ydElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBTZW5kQXNGaWx0ZXJQYXJhbWV0ZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZCBmaWVsZCB2YWx1ZSBhcyBSZXBvcnQgRmlsdGVyIFBhcmFtZXRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cImlmOiBTZW5kQXNGaWx0ZXJQYXJhbWV0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkxpbmsgdG8gdGhpcyBSZXBvcnQgRmlsdGVyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhbGxGaWVsZHMsIG9wdGlvbnNUZXh0OiAnZmllbGROYW1lJywgb3B0aW9uc1ZhbHVlOiAnZmllbGRJZCcsIHZhbHVlOiBTZWxlY3RlZEZpbHRlcklkLCBvcHRpb25zQ2FwdGlvbjogJ0Nob29zZSB0aGUgRmllbGQgdG8gRmlsdGVyIGJ5IHZhbHVlJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogTGlua3NUb1JlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+TGluayB0byB0aGlzIFVSTDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkVudGVyIGEgdXJsIHRvIG9wZW5cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogTGlua1RvVXJsXCIgdGl0bGU9XCJWYWxpZCBVUkwgbmVlZHMgdG8gc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2VuZEFzUXVlcnlQYXJhbWV0ZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZCBmaWVsZCB2YWx1ZSBhcyBRdWVyeSBQYXJhbWV0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogU2VuZEFzUXVlcnlQYXJhbWV0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlBhcmFtZXRlciBOYW1lIHRvIHVzZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkVudGVyIHBhcmFtZXRlciBuYW1lIHRvIHNlbmQgdmFsdWUgYXNcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUXVlcnlQYXJhbWV0ZXJOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHJlbW92ZUxpbmtGaWVsZFwiPlJlbW92ZSBMaW5rPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlTGlua0ZpZWxkXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1jaG9vc2UtdmlzdWFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlZpc3VhbGl6YXRpb24gT3B0aW9uc1wiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0xpc3QnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nTGlzdCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWxpc3QtYWx0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5MaXN0PC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1N1bW1hcnknKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nU3VtbWFyeScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXRhYmxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5TdW1tYXJ5PC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0JhcicpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdCYXInIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1iYXItY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkJhcjwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdQaWUnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nUGllJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtcGllLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5QaWU8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnTGluZScpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdMaW5lJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtbGluZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+TGluZTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdDb21ibycpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdDb21ibycgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXNpZ25hbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+Q29tYm88L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnSHRtbCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtY29kZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+Q3VzdG9tPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ01hcCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCkuaW5kZXhPZignTWFwJyk9PTAgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWdsb2JlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5NYXA8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnSGVhdE1hcCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCkuaW5kZXhPZignSGVhdE1hcCcpPT0wIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1tYXBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkhlYXRNYXA8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnU2luZ2xlJyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1NpbmdsZScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXdpbmRvdy1tYXhpbWl6ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+S1BJPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1RyZWVtYXAnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nVHJlZW1hcCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXdpbmRvdy1yZXN0b3JlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5UcmVlbWFwPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1Bpdm90Jyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1Bpdm90JyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtcmFuZG9tXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5UcmFuc3Bvc2U8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLWNob29zZS1kYXRhXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgYnRuLWdyb3VwIGJ0bi1ncm91cC10b2dnbGVcIiByb2xlPVwiZ3JvdXBcIiBkYXRhLWJpbmQ9XCJpZjogUmVwb3J0SUQoKSA8PSAwXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IGFjdGl2ZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAwcHg7XCIgdGl0bGU9XCJZb3UgY2FuIGNoYW5nZSB0aGUgRGF0YSBzb3VyY2Ugb25seSB3aGVuIGNyZWF0aW5nIGEgbmV3IHJlcG9ydCwgY2hhbmdpbmcgdGhpcyB3aWxsIGNsZWFyIGFsbCBzZWxlY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRhdGFvcHRpb25cIiBpZD1cInRhYmxlXCIgY2hlY2tlZCBkYXRhLWJpbmQ9XCJjaGVja2VkOiB1c2VTdG9yZWRQcm9jLCBjaGVja2VkVmFsdWU6IGZhbHNlXCI+IER5bmFtaWNcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRhdGFvcHRpb25cIiBpZD1cInByb2NcIiB2YWx1ZT1cIjFcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiB1c2VTdG9yZWRQcm9jLCBjaGVja2VkVmFsdWU6IHRydWVcIj4gUHJlZGVmaW5lZFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIkFkZCBDdXN0b20gRmllbGQgdXNpbmcgRm9ybXVsYVwiIGRhdGEtYmluZD1cImhpZGRlbjogaXNGdW5jdGlvbkZpZWxkKCkgfHwgdXNlU3RvcmVkUHJvYygpLCBjbGljazogY2FuY2VsRm9ybXVsYUZpZWxkLCB0ZXh0OiBpc0Zvcm11bGFGaWVsZCgpPyAnQ2FuY2VsJzogJ0N1c3RvbSBGaWVsZCcsIGNzczogeydidG4tcHJpbWFyeSc6ICFpc0Zvcm11bGFGaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRm9ybXVsYUZpZWxkfVwiPjwvYT5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIHRpdGxlPVwiQWRkIEN1c3RvbSBGaWVsZCB1c2luZyBGdW5jdGlvblwiIGRhdGEtYmluZD1cImhpZGRlbjogdHJ1ZSB8fCBpc0Zvcm11bGFGaWVsZCgpIHx8IHVzZVN0b3JlZFByb2MoKSwgY2xpY2s6IGZ1bmN0aW9uKCl7ZGVzaWduRnVuY3Rpb25GaWVsZCgpfSwgdGV4dDogaXNGdW5jdGlvbkZpZWxkKCk/ICdDYW5jZWwnOiAnRnVuY3Rpb24gRmllbGQnLCBjc3M6IHsnYnRuLXByaW1hcnknOiAhaXNGdW5jdGlvbkZpZWxkKCksICdidG4tZGFuZ2VyJzogaXNGdW5jdGlvbkZpZWxkfVwiPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cImRpc2FibGU6IGlzRm9ybXVsYUZpZWxkLCBoaWRkZW46IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiB0ZXh0UXVlcnkuc2VhcmNoRmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwic2VhcmNoLWZpZWxkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7ZHJvcGRvd25QYXJlbnQ6ICRyb290LmFjdGl2ZURlc2lnbigpID8gJCgnI2Nob29zZS1kYXRhLWRlc2lnbicpIDogJCgnI2Nob29zZS1kYXRhLWNhcmQnKSwgcGxhY2Vob2xkZXI6ICdTZWFyY2ggZm9yIGEgRGF0YSBGaWVsZC4uLicsIGFqYXg6IHsgdXJsOiB1cmwsIGRhdGFUeXBlOiAnanNvbicsIGRhdGE6IHF1ZXJ5LCBwcm9jZXNzUmVzdWx0czogcHJvY2Vzc1Jlc3VsdHMsIGhlYWRlcnM6IGhlYWRlcnMgfSwgbWluaW11bUlucHV0TGVuZ3RoOiAyLCBhbGxvd0NsZWFyOiB0cnVlIH0sIHZhbHVlOiBzZWxlY3RlZE9wdGlvblwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cInZpc2libGU6IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyVmFsdWU6IHtkcm9wZG93blBhcmVudDogJHJvb3QuYWN0aXZlRGVzaWduKCkgPyAkKCcjY2hvb3NlLWRhdGEtZGVzaWduJykgOiAkKCcjY2hvb3NlLWRhdGEtY2FyZCcpfSwgb3B0aW9uczogUHJvY3MsIG9wdGlvbnNDYXB0aW9uOiAnQ2hvb3NlIFNlY3Rpb24uLi4nLCBvcHRpb25zVGV4dDogJ0Rpc3BsYXlOYW1lJywgdmFsdWU6IFNlbGVjdGVkUHJvYywgdmlzaWJsZTogdXNlU3RvcmVkUHJvY1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgZGF0YS1iaW5kPVwiaGlkZGVuOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIiBzdHlsZT1cInBhZGRpbmctdG9wOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IERhdGEgdG8gdXNlIGluIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGV4dC1tdXRlZFwiIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiQ2hvb3NlIGEgdGFibGUgdG8gc2hvdyBmaWVsZHMgdG8gc2VsZWN0LlwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1zZWxlY3QtdHJlZVwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBDYXRlZ29yaXplZFRhYmxlcyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IGlzRXhwYW5kZWQoIWlzRXhwYW5kZWQoKSk7IH0sIHZpc2libGU6IGNhdGVnb3J5TmFtZVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBpc0V4cGFuZGVkKCkgPyAnZmEtY2hldnJvbi1kb3duIHRleHQtc2Vjb25kYXJ5JyA6ICdmYS1jaGV2cm9uLXJpZ2h0IHRleHQtc2Vjb25kYXJ5J1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogaXNFeHBhbmRlZCgpID8gJ2ZhLWZvbGRlci1vcGVuJyA6ICdmYS1mb2xkZXInXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBjYXRlZ29yeU5hbWVcIiBjbGFzcz1cIm1sLTJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1saXN0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNFeHBhbmRlZCgpLCBmb3JlYWNoOiB0YWJsZXNcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTVweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBib3JkZXItYm90dG9tIHB5LTIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzZWxlY3RUYWJsZSgkZGF0YSk7IH0sIGNzczogeyd0ZXh0LW11dGVkJzogIWlzRW5hYmxlZCgpfSwgc3R5bGU6IHtjdXJzb3I6IGlzRW5hYmxlZCgpID8gJ3BvaW50ZXInIDogJyd9LCBhdHRyOiB7dGl0bGU6ICFpc0VuYWJsZWQoKSA/ICdDYW5ub3QgdXNlIHRhYmxlIGFzIGpvaW5zIGRvIG5vdCBleGlzdCc6ICcnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5IGZhXCIgZGF0YS1iaW5kPVwiY3NzOiBpc0VuYWJsZWQoKSA/ICgkZGF0YSA9PT0gJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpID8gJ2ZhLWNoZXZyb24tZG93bicgOiAnZmEtY2hldnJvbi1yaWdodCcpIDogJ2ZhLWJhbidcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdGFibGVcIj48L3NwYW4+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGFibGVOYW1lXCIgY2xhc3M9XCJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkZGF0YSA9PT0gJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpICYmICEkcGFyZW50c1sxXS5pc0Zvcm11bGFGaWVsZCgpICYmICEkcGFyZW50c1sxXS5TZWxlY3RlZFRhYmxlKCkuZHluYW1pY0NvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudHNbMV0uTW92ZUFsbEZpZWxkc1wiPlNlbGVjdCBhbGw8L2E+IHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudHNbMV0uUmVtb3ZlU2VsZWN0ZWRGaWVsZHNcIj5SZW1vdmUgYWxsPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWVsZHMgRXhwYW5kIEhlcmUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICRkYXRhID09PSAkcGFyZW50c1sxXS5TZWxlY3RlZFRhYmxlKClcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMzBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6ICRwYXJlbnRzWzFdLkNob29zZUZpZWxkcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGJvcmRlci1ib3R0b20gcHktMiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWRJbkFycmF5OiB7YXJyYXk6ICRwYXJlbnRzWzJdLmlzRm9ybXVsYUZpZWxkKCkgPyAkcGFyZW50c1syXS5mb3JtdWxhRmllbGRzIDogJHBhcmVudHNbMl0uU2VsZWN0ZWRGaWVsZHMsIHZhbHVlOiAkZGF0YX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZE5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItc2VsZWN0ZWQtZGF0YVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTZWxlY3RlZEZpZWxkcygpLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgUGxlYXNlIGNob29zZSBkYXRhXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IFNlbGVjdGVkRmllbGRzKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nQmFyJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIEJhciBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgc2hvdyBvbiB0aGUgeC1heGlzLiBBbGwgb3RoZXIgbnVtZXJpYyBmaWVsZHMgd2lsbCBzaG93IG9uIHktYXhpcy5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBiYXJDaGFydEhvcml6b250YWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgSG9yaXpvbnRhbCBCYXIgQ2hhcnRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBiYXJDaGFydFN0YWNrZWRcIiAvPlxyXG4gICAgICAgICAgICAgICAgU3RhY2tlZCBCYXIgQ2hhcnRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdQaWUnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgUGllIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgd2lsbCBiZSBncm91cGVkLCBhbmQgdGhlIGZpcnN0IG51bWVyaWMgZmllbGQgd2lsbCBzaG93IGFzIHRoZSByYXRpby5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBwaWVDaGFydERvbnV0XCIgLz5cclxuICAgICAgICAgICAgICAgIERvbnV0IENoYXJ0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nVHJlZW1hcCdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBUcmVlbWFwLCB0aGUgZGF0YSBtdXN0IGJlIGluIGEgaGllcmFyY2hpY2FsIGZvcm1hdCB3aXRoIDJuZCBjb2x1bW4gaGF2aW5nIHBhcmVudCBhbmQgdGhpcmQgY29sdW1uIGhhdmluZyBhIG51bWVyaWMgdmFsdWUuIFRoZSBkYXRhIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IG5vZGUgaGF2aW5nIG51bGwgYXMgaXRzIHBhcmVudCBhcyB3ZWxsLlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0hlYXRNYXAnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vIGZhLTJ4XCI+PC9zcGFuPiZuYnNwO0ZvciBIZWF0TWFwLCB0aGUgZmlyc3QgdHdvIGNvbHVtbnMgbXVzdCBiZSBudW1lcmljIHZhbHVlcyByZXByZXNlbnRpbmdcclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+TGF0aXR1ZGU8L3N0cm9uZz4gYW5kIDxzdHJvbmc+TG9uZ2l0dWRlPC9zdHJvbmc+LiBBdCBsZWFzdCBvbmUgYWRkaXRpb25hbCBudW1lcmljIGNvbHVtbiBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRoZVxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz5pbnRlbnNpdHk8L3N0cm9uZz4gb2YgZWFjaCBwb2ludC5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGVhdE1hcE9wdGlvbnMuc2hvd01hcmtlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgTWFya2VyXHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgZnctYm9sZFwiPkhlYXRtYXAgQ29sb3JzPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgbWItMlwiPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiBoZWF0TWFwT3B0aW9ucy5ncmFkaWVudDFcIiB0aXRsZT1cIkdyYWRpZW50IDFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhdE1hcE9wdGlvbnMuZ3JhZGllbnQyXCIgdGl0bGU9XCJHcmFkaWVudCAyXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IGhlYXRNYXBPcHRpb25zLmdyYWRpZW50M1wiIHRpdGxlPVwiR3JhZGllbnQgM1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nTGluZSdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBMaW5lIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgd2lsbCBzaG93IG9uIHRoZSB4LWF4aXMuIEFsbCBvdGhlciBmaWVsZHMgd2lsbCBudW1lcmljIGZpZWxkcyB3aWxsIHNob3cgb24geS1heGlzLlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IHNtYWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGxpbmVDaGFydEFyZWFcIiAvPlxyXG4gICAgICAgICAgICAgICAgQXJlYSBDaGFydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0NvbWJvJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIENvbWJvIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgd2lsbCBzaG93IG9uIHRoZSB4LWF4aXMuIEFsbCBvdGhlciBudW1lcmljIGZpZWxkcyB3aWxsIHNob3cgb24geS1heGlzLCBhbmQgeW91IGNhbiBjaG9vc2UgZGlzcGxheSBlYWNoIHNlcmllcyBhcyBsaW5lLCBiYXIgb3IgYXJlYS5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5EZWZhdWx0IFNlcmllcyBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IHNlcmllc1R5cGVzLCB2YWx1ZTogY29tYm9DaGFydFR5cGVcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J1Bpdm90J1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0wXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIFRyYW5zcG9zZSwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgYmUgdXNlZCB0byBQaXZvdC9UcmFuc3Bvc2UgdGhlIHJvd3MgYXMgY29sdW1ucywgYW5kIGl0IG11c3QgYmUgZ3JvdXBlZC5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nU2luZ2xlJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0wXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7S1BJIGlzIGEgc2luZ2xlIHZhbHVlIHJlcG9ydCB0aGF0IGlzIGlkZWFsIGZvciBwbGFjaW5nIG9uIGEgRGFzaGJvYXJkLiBBbGwgZmllbGRzIGV4Y2VwdCBvbmUgbXVzdCBiZSBoaWRkZW4gZm9yIFdpZGdldHMuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0h0bWwnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogZG9udEdyb3VwQ3VzdG9tXCIgLz5cclxuICAgICAgICAgICAgICAgIExpc3QgKERvbid0IFN1bW1hcml6ZSlcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdNYXAnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgTWFwIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgaGFzIHRvIGJlIGEgUmVnaW9uLCBsaWtlIGEgQ291bnRyeS5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb250cm9sLWxhYmVsXCI+TWFwIERpc3BsYXk8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IG1hcFJlZ2lvbnMsIHZhbHVlOiBtYXBSZWdpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwXCIgZGF0YS1iaW5kPVwic29ydGFibGU6IHsgZGF0YTogU2VsZWN0ZWRGaWVsZHMsIG9wdGlvbnM6IHsgaGFuZGxlOiAnLnNvcnRhYmxlJywgY3Vyc29yOiAnbW92ZScsIHBsYWNlaG9sZGVyOiAnZHJvcC1oaWdobGlnaHQnIH0sIHN0cmF0ZWd5TW92ZTogdHJ1ZSB9XCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydGFibGUgcHVsbC1sZWZ0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxNXB4O1wiIGRhdGEtYmluZD1cImlmbm90OiAkcGFyZW50LnVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJEcmFnIHRvIHJlb3JkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY29sdW1uc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZEZpZWxkTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBpc0Zvcm11bGFGaWVsZCgpID8gJygnICsgZmllbGRGb3JtYXQoKSArICcpJyA6ICcnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6ICEkcGFyZW50LmlzRmllbGRWYWxpZEZvcllBeGlzKCRpbmRleCgpLCBmaWVsZFR5cGUgfHwgZmllbGRGb3JtYXQoKSwgc2VsZWN0ZWRBZ2dyZWdhdGUoKSkgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0nVHJlZW1hcCcgJiYgJHBhcmVudC5pc0NoYXJ0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1kYW5nZXJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhZ3JvdXBJbkdyYXBoKClcIj5XaWxsIG5vdCBzaG93IGluIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRwYXJlbnQuUmVwb3J0VHlwZVwiPjwvc3Bhbj5DaGFydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5Jc1Bpdm90RmllbGRMYXN0Q29sdW1uKCRpbmRleCgpLHNlbGVjdGVkQWdncmVnYXRlKCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCIgPlBpdm90IGZpZWxkIGNhbm5vdCBiZSB0aGUgbGFzdCBjb2x1bW4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LklzRHluYW1pY0ZpZWxkRmlyc3RDb2x1bW4oJGluZGV4KCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCIgPkR5bmFtaWMgY2Fubm90IGJlIGZpcnN0IGNvbHVtbi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwibWFyZ2luLXRvcDogLTVweDtcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5BZ2dyZWdhdGVSZXBvcnQoKSAmJiAhJHBhcmVudC51c2VTdG9yZWRQcm9jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6ICRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgJGluZGV4KCk+MCA/IGZpZWxkQWdncmVnYXRlV2l0aERyaWxsZG93biA6IGZpZWxkQWdncmVnYXRlLCB2YWx1ZTogc2VsZWN0ZWRBZ2dyZWdhdGVcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwiaWZub3Q6ICRwYXJlbnQudXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiB0aXRsZT1cIkNhbm5vdCBEZWxldGUgUmVxdWlyZWQgRmlsdGVyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZm9yY2VGaWx0ZXJGb3JUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRGVsZXRlIHRoaXMgRmllbGRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5SZW1vdmVGaWVsZCwgaGlkZGVuOiBmb3JjZUZpbHRlckZvclRhYmxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS08ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJpZm5vdDogJHBhcmVudC51c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IGZpbHRlck9uRmx5KCFmaWx0ZXJPbkZseSgpKTsgfSwgY3NzOiB7YWN0aXZlOiBmaWx0ZXJPbkZseSgpPT10cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkZpbHRlciBieSB0aGlzIGZpZWxkIG9uIHRoZSBSZXBvcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J1Bpdm90J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVEaXNhYmxlLCBjc3M6IHthY3RpdmU6IGRpc2FibGVkKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNsb3NlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJEbyBub3QgaW5jbHVkZSBpbiBSZXBvcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J1Bpdm90JyAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J0xpc3QnICYmICEkcGFyZW50LnVzZVN0b3JlZFByb2MoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBoaWRlSW5EZXRhaWwoIWhpZGVJbkRldGFpbCgpKTsgfSwgY3NzOiB7YWN0aXZlOiBoaWRlSW5EZXRhaWwoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZXllLXNsYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJIaWRlIGluIERldGFpbHNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmlzRmllbGRWYWxpZEZvcllBeGlzKCRpbmRleCgpLCBmaWVsZFR5cGUgfHwgZmllbGRGb3JtYXQoKSwgc2VsZWN0ZWRBZ2dyZWdhdGUoKSkgICYmICRwYXJlbnQuaXNDaGFydCgpICYmICRpbmRleCgpPjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgZ3JvdXBJbkdyYXBoKCFncm91cEluR3JhcGgoKSk7IH0sIGNzczoge2FjdGl2ZTogZ3JvdXBJbkdyYXBoKCk9PWZhbHNlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1zaWduYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkluY2x1ZGUgaW4gc2VyaWVzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5JbmNsdWRlU3ViVG90YWwoKSAgJiYgIChbJ0ludCcsICdEb3VibGUnLCAnTW9uZXknLCAnRGVjaW1hbCcsICdDdXJyZW5jeSddLmluZGV4T2YoZmllbGRUeXBlKSA+PSAwIHx8IFsnSW50JywgJ0RvdWJsZScsICdNb25leScsICdEZWNpbWFsJywgJ0N1cnJlbmN5J10uaW5kZXhPZihmaWVsZEZvcm1hdCgpKSA+PSAwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBkb250U3ViVG90YWwoIWRvbnRTdWJUb3RhbCgpKTsgfSwgY3NzOiB7YWN0aXZlOiBkb250U3ViVG90YWwoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGx1cy1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkRvbid0IGFkZCB0byBUb3RhbCByb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J1Bpdm90J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBzZXR1cExpbmtGaWVsZCwgY3NzOiB7YWN0aXZlOiBsaW5rRmllbGQoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlua1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiTGluayB0byBhbm90aGVyIFJlcG9ydCBvciBVcmxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKT09J0NvbWJvJyAmJiAkcGFyZW50LmlzRmllbGRWYWxpZEZvcllBeGlzKCRpbmRleCgpLCBmaWVsZFR5cGUgfHwgZmllbGRGb3JtYXQoKSwgc2VsZWN0ZWRBZ2dyZWdhdGUoKSkgICYmICRwYXJlbnQuaXNDaGFydCgpICYmICRpbmRleCgpPjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2VyaWVzVHlwZShzZXJpZXNUeXBlKCkgPT0gJ2xpbmUnID8gJ2FyZWEnIDogKHNlcmllc1R5cGUoKT09J2JhcnMnID8gJ2xpbmUnIDogJ2JhcnMnKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJpbmQ9XCJjc3M6IHsnZmEtbGluZS1jaGFydCc6IHNlcmllc1R5cGUoKSA9PSAnbGluZScsICdmYS1iYXItY2hhcnQnOiBzZXJpZXNUeXBlKCkgPT0gJ2JhcnMnLCAnZmEtYXJlYS1jaGFydCc6IHNlcmllc1R5cGUoKT09J2FyZWEnIH0sIGF0dHI6IHt0aXRsZTogc2VyaWVzVHlwZX1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogc2V0dXBGaWVsZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZ2VhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiTW9yZSBPcHRpb25zXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwiaWY6IGlzRm9ybXVsYUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGVkaXRGb3JtdWxhRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJFZGl0IEZvcm11bGEgRmllbGRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLXN1Yi1yZXBvcnRcIj5cclxuICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZCBtYi0zXCI+XHJcbiAgICAgICAgTGlua2VkIHJlcG9ydHMgYXJlIGF2YWlsYWJsZSB0byBhZGQgYXMgc3ViIHJlcG9ydHMuXHJcbiAgICAgICAgU2VsZWN0aW5nIHN1YiByZXBvcnRzIHdpbGwgcmVzdHJpY3QgdGhlIHJlcG9ydCB0byA8c3Ryb25nPm9uZSByZWNvcmQgcGVyIHBhZ2U8L3N0cm9uZz4uXHJcbiAgICA8L3A+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogbGlua2VkUmVwb3J0RmllbGRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICduYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFN1YlJlcG9ydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDYXB0aW9uOiAnU2VsZWN0IGEgbGlua2VkIHJlcG9ydC4uLidcIj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgIDwvZGl2PlxyXG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiXHJcbiAgICAgICAgZGF0YS1iaW5kPVwic29ydGFibGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3ViUmVwb3J0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogeyBoYW5kbGU6ICcuc29ydGFibGUnLCBjdXJzb3I6ICdtb3ZlJywgcGxhY2Vob2xkZXI6ICdkcm9wLWhpZ2hsaWdodCcgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFycyBzb3J0YWJsZSBtZS0yXCIgc3R5bGU9XCJjdXJzb3I6bW92ZTtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBuYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZVN1YlJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgRGVsZXRlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItaHRtbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IFNlbGVjdGVkRmllbGRzLCB2YWx1ZTogU2VsZWN0RmllbGRUb0luc2VydCwgb3B0aW9uc0NhcHRpb246ICdTZWxlY3QgYSBmaWVsZC4uLicsIG9wdGlvbnNUZXh0OiAnc2VsZWN0ZWRGaWVsZE5hbWUnXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBkcm9wZG93bi10b2dnbGVcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRhYmxlXCI+PC9pPiBJbnNlcnQgYXMgVGFibGVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRGaWVsZFRhYmxlVHJhbnNwb3NlZFwiPlRyYW5zcG9zZWQ8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRGaWVsZFRhYmxlU3RhbmRhcmRcIj5TdGFuZGFyZDwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxociBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGluc2VydEhlYWRlckJyZWFrXCI+QWRkIEhlYWRlciBCcmVhazwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGluc2VydEZvb3RlckJyZWFrXCI+QWRkIEZvb3RlciBCcmVhazwvYT48L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLWF1dG8gbXMtMlwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2FyZFZpZXdcIj5cclxuICAgICAgICAgICAgQ2FyZCBMYXlvdXRcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDx0ZXh0YXJlYSBkYXRhLWJpbmQ9XCJzdW1tZXJub3RlOiByZXBvcnRIdG1sXCI+PC90ZXh0YXJlYT5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItc29ydFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogdXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtYXV0byBjb250cm9sLWxhYmVsXCI+U29ydCBCeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogRmlsdGVyZWRGaWVsZHMsIG9wdGlvbnNUZXh0OiAnc2VsZWN0ZWRGaWVsZE5hbWUnLCBvcHRpb25zVmFsdWU6ICdmaWVsZElkJywgdmFsdWU6IFNvcnRCeUZpZWxkLCBvcHRpb25zQ2FwdGlvbjogJ1NlbGVjdCBmaWVsZCB0byBzb3J0Li4uJywgYWxsb3dDbGVhcjogdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZC1mbGV4IGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInRleHQ6ICFTb3J0RGVzYygpID8gJ+KWsiBBc2NlbmRpbmcnIDogJ0Rlc2NlbmRpbmcg4pa8JywgY2xpY2s6IGZ1bmN0aW9uKCkgeyBTb3J0RGVzYyghU29ydERlc2MoKSk7IHJldHVybiBmYWxzZTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogYWRkU29ydEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIEFkZCBTb3J0XHJcbiAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IFNvcnRGaWVsZHNcIj5cclxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtYXV0byBjb250cm9sLWxhYmVsXCI+Jm5ic3A7Jm5ic3A7VGhlbiBTb3J0IEJ5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50LkZpbHRlcmVkRmllbGRzLCBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJywgb3B0aW9uc1ZhbHVlOiAnZmllbGRJZCcsIHZhbHVlOiBzb3J0QnlGaWVsZElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBkLWZsZXggZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogcmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgU29ydFxyXG4gICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ0ZXh0OiAhc29ydERlc2MoKSA/ICfilrIgQXNjZW5kaW5nJyA6ICdEZXNjZW5kaW5nIOKWvCcsIGNsaWNrOiBmdW5jdGlvbigpIHsgc29ydERlc2MoIXNvcnREZXNjKCkpOyByZXR1cm4gZmFsc2U7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuYWRkU29ydEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgU29ydFxyXG4gICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLW9wdGlvbnNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nUGl2b3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IEluY2x1ZGVTdWJUb3RhbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBUb3RhbCBSb3dcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IEFnZ3JlZ2F0ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBTaG93VW5pcXVlUmVjb3Jkc1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgU2hvdyBvbmx5IFVuaXF1ZSBSZWNvcmRzXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nTGlzdCdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2hvd0V4cGFuZE9wdGlvblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgRG9uJ3QgU2hvdyBFeHBhbmQgT3B0aW9uXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzQ2hhcnRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2hvd0RhdGFXaXRoR3JhcGhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgRGF0YSBhbG9uZyB3aXRoIEdyYXBoXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IERvbnRFeGVjdXRlT25SdW5cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFdhaXQgdG8gU2VsZWN0IEZpbHRlcnMgYmVmb3JlIFJ1bm5pbmcgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBtYXhSZWNvcmRzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTWF4IFJlY29yZHNcclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIiBkYXRhLWJpbmQ9XCJpZjogbWF4UmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgc3R5bGU9XCJ3aWR0aDogMTUwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIk9ubHkgdG9wIG4uLi5cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogT25seVRvcCwgdmlzaWJsZTogbWF4UmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFuZ2VQYWdlU2l6ZSwgZGlzYWJsZTogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIENoYW5nZSBQYWdlIFNpemVcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmlzaWJsZTogY2hhbmdlUGFnZVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzOiB7ICd0ZXh0LW11dGVkJzogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBzdHlsZT1cIndpZHRoOiAxNTBweDtcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogWzEsMTAsMzAsNTAsMTAwLDE1MCwyMDAsNTAwLDEwMDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRGVmYXVsdFBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBzdWJSZXBvcnRzKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEZvcmNlIGRlZmF1bHQgdG8gMSBpZiBzdWIgcmVwb3J0cyBzZWxlY3RlZCAtLT5cclxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICBQYWdlIHNpemUgaXMgcmVzdHJpY3RlZCB0byAxIHdoZW4gc3ViIHJlcG9ydHMgYXJlIHNlbGVjdGVkLlxyXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9XCJmYSBmYS1wYWludC1icnVzaFwiPjwvc3Bhbj4gUGljayBSZXBvcnQgRm9ybWF0PC9wPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB0YWJsZVN0eWxlcyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1vcHRpb25cIiBkYXRhLWJpbmQ9XCJ0aXRsZTogJGRhdGEubmFtZSwgY2xpY2s6ICRwYXJlbnQuc2VsZWN0U3R5bGUsIGNzczogeydkcm9wZG93bi1vcHRpb24tc2VsZWN0ZWQnOiAkcGFyZW50LnNlbGVjdGVkU3R5bGUoKSA9PSAkZGF0YS5jb2xvcnNjaGVtZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10YWJsZS1wcmV2aWV3XCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogbmV3IEFycmF5KDUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLXJvd1wiIGRhdGEtYmluZD1cImZvcmVhY2g6IG5ldyBBcnJheSg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbmktdGFibGUtY2VsbFwiIGRhdGEtYmluZD1cInN0eWxlOiB7IGJhY2tncm91bmRDb2xvcjogJHBhcmVudENvbnRleHQuJGluZGV4KCkgPT09IDAgPyAkcGFyZW50c1sxXS5oZWFkZXJCZyA6ICgkcGFyZW50Q29udGV4dC4kaW5kZXgoKSAlIDIgPT09IDAgPyAkcGFyZW50c1sxXS5hbHRSb3dCZyA6ICRwYXJlbnRzWzFdLnJvd0JnKSwgY29sb3I6ICRwYXJlbnRzWzFdLnRleHRDb2xvciB9XCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogbm9IZWFkZXJSb3dcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIE5vIEhlYWRlciBSb3dcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogbm9EYXNoYm9hcmRCb3JkZXJzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBCb3JkZXJsZXNzIG9uIERhc2hib2FyZFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImlmOiBSZXBvcnRUeXBlKCkgPT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2hvd1ByaW9ySW5LcGlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgcHJldmlvdXMgY29tcGFyaXNpb24gaW4gS1BJIGlmIGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJjdXN0b20tZmllbGQtZGVzaWduZXJcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNGb3JtdWxhRmllbGQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICBZb3UgYXJlIG5vdyBjcmVhdGluZyBhIEN1c3RvbWl6ZWQgRmllbGQuIFBsZWFzZSBzZWxlY3QgdGhlIGZpZWxkcyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIGNhbGN1bGF0aW9uLCB0aGVuIGNob29zZSB0aGUgb3BlcmF0aW9ucyB5b3Ugd2FudCB0byBwZXJmb3JtLCBhbmQgY2xpY2sgXCJTYXZlXCIgdG8gYWRkIHlvdXIgQ3VzdG9tIGZpZWxkLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02IHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICBTZXR1cCB5b3VyIEZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHRoaXMgRmllbGRcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNiByaWdodC1hbGlnblwiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFUeXBlKCk9PSdidWlsZCdcIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkRm9ybXVsYVBhcmVudGhlc2VzXCI+QWRkICggKTwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIkFkZCBUb2RheVwiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFPbmx5SGFzRGF0ZUZpZWxkcygpIHx8IGZvcm11bGFGaWVsZHMoKS5sZW5ndGggPT0gMCwgY2xpY2s6IGFkZEZvcm11bGFEYXRlVG9kYXlcIj5BZGQgVG9kYXk8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgdGl0bGU9XCJBZGQgYSBDb25zdGFudCBWYWx1ZVwiIGRhdGEtYmluZD1cImNsaWNrOiBhZGRGb3JtdWxhQ29uc3RhbnRWYWx1ZVwiPkFkZCBWYWx1ZTwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWJpbmQ9XCJjbGljazogY2xlYXJGb3JtdWxhRmllbGRcIj5DbGVhcjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgZGF0YS1iaW5kPVwiaWY6IGZvcm11bGFPbmx5SGFzRGF0ZUZpZWxkc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIEZvciBEYXRlcyBGaWVsZCBjYWxjdWxhdGlvbiwgeW91IGNhbiBvbmx5IHN1YnN0cmFjdCBkYXRlIGZpZWxkcyBhbmQgZGlzcGxheSB0aGUgcmVzdWx0IGFzIGRheXMsIGhvdXJzLCBtaW51dGVzIG9yIHNlY29uZHMuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRmllbGRMYWJlbFwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiQ3VzdG9tIEZpZWxkIExhYmVsXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5EYXRhIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRGF0YUZvcm1hdFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6IGZvcm11bGFPbmx5SGFzRGF0ZUZpZWxkcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlN0cmluZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SW50ZWdlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RGVjaW1hbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Q3VycmVuY3k8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5EYXlzPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5Ib3Vyczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+TWludXRlczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+U2Vjb25kczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0RlY2ltYWwnIHx8IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+Um91bmQgdG8gRGVjaW1hbCBQbGFjZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFEZWNpbWFsUGxhY2VzXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgdGl0bGU9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYXBwU2V0dGluZ3MudXNlU3FsQ3VzdG9tRmllbGRcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPkZpZWxkIEJ1aWxkZXIgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhVHlwZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJidWlsZFwiPlNpbXBsZSBDYWxjdWxhdGlvbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzcWxcIj5BZHZhbmNlZCBFeHByZXNzaW9uPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cImlmOiBmb3JtdWxhVHlwZSgpPT0nYnVpbGQnXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBGb3JtdWxhPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhRmllbGRzKCkubGVuZ3RoID09IDBcIj5QaWNrIGZpZWxkcyB0byBidWlsZCBjYWxjdWxhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogZm9ybXVsYUZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm1lLTNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZXR1cEZvcm11bGEuaXNQYXJlbnRoZXNlc1N0YXJ0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwO1wiPig8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6ICFzZXR1cEZvcm11bGEuaXNQYXJlbnRoZXNlc1N0YXJ0KCkgJiYgIXNldHVwRm9ybXVsYS5pc1BhcmVudGhlc2VzRW5kKClcIiBjbGFzcz1cImxpc3QtZ3JvdXAgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZm9ybXVsYS1maWVsZC1pdGVtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTVweDsgcGFkZGluZzogNXB4IDE1cHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZpZWxkTmFtZSwgdmlzaWJsZTogIXNldHVwRm9ybXVsYS5pc0NvbnN0YW50VmFsdWUoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNldHVwRm9ybXVsYS5pc0NvbnN0YW50VmFsdWVcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS1iaW5kPVwidmFsdWU6IHNldHVwRm9ybXVsYS5jb25zdGFudFZhbHVlLCB2aXNpYmxlOiBzZXR1cEZvcm11bGEuY29uc3RhbnRWYWx1ZSgpIT0nfFRvZGF5fCdcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWUtMlwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogc2V0dXBGb3JtdWxhLmNvbnN0YW50VmFsdWUoKSA9PSAnfFRvZGF5fCdcIj48Yj5Ub2RheTwvYj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlciBidG4tc20gbXMtMlwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtZS0zXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2V0dXBGb3JtdWxhLmlzUGFyZW50aGVzZXNFbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDA7XCI+KTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTNcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxNXB4O1wiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuc2hvd0Zvcm11bGFPcGVyYXRpb24oJGluZGV4KCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDUwcHg7XCIgZGF0YS1iaW5kPVwidmFsdWU6IHNldHVwRm9ybXVsYS5mb3JtdWxhT3BlcmF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAhJHBhcmVudC5mb3JtdWxhT25seUhhc0RhdGVGaWVsZHMoKSB8fCAoJHBhcmVudC5mb3JtdWxhT25seUhhc0RhdGVGaWVsZHMoKSAmJiAkcGFyZW50LmlzQ29uc3RhbnRPcGVyYXRpb24oJGluZGV4KCkpKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Kzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPi08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnSW50ZWdlcicsJ01vbmV5JywnRmxvYXQnLCdEb3VibGUnLCdEZWNpbWFsJywnQ3VycmVuY3knXS5pbmRleE9mKCRwYXJlbnQuZm9ybXVsYURhdGFGb3JtYXQoKSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPio8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Lzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBjdXN0b21TcWxGaWVsZCwgdmlzaWJsZTogZm9ybXVsYVR5cGUoKT09J3NxbCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IERhdGEgT3BlcmF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cInNlbGVjdDI6IHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duUGFyZW50OiAkcm9vdC5hY3RpdmVEZXNpZ24oKSA/ICQoJyNjaG9vc2UtZGF0YS1kZXNpZ24nKSA6ICQoJyNjaG9vc2UtZGF0YS1jYXJkJyksXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBGdW5jdGlvbi4uLicsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBhdmFpbGFibGVGdW5jdGlvbnNHcm91cGVkKCksXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlc3VsdDogdGVtcGxhdGVSZXN1bHRcclxuICAgICAgICAgICAgfSwgdmFsdWU6IHNlbGVjdGVkU3FsRnVuY3Rpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IGlzQ29uZGl0aW9uYWxGdW5jdGlvbigpIHx8IHNlbGVjdGVkU3FsRnVuY3Rpb24oKSA9PSAnT3RoZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZWxlY3QgdGhlIERhdGEgRmllbGQgdG8gdXNlOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwic2VsZWN0Mjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93blBhcmVudDogJHJvb3QuYWN0aXZlRGVzaWduKCkgPyAkKCcjY2hvb3NlLWRhdGEtZGVzaWduJykgOiAkKCcjY2hvb3NlLWRhdGEtY2FyZCcpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBGaWVsZC4uLicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFqYXg6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAkcGFyZW50LnRleHRRdWVyeS5zZWFyY2hGaWVsZHMucXVlcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVzdWx0czogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLnByb2Nlc3NSZXN1bHRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLmhlYWRlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NsZWFyOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2VsZWN0MlRleHQ6IHNlbGVjdGVkRmllbGQsc2VsZWN0MlRhYmxlSWQ6c2VsZWN0ZWRGaWVsZFRhYmxlSWRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBzZWxlY3RlZEZpZWxkXCIgY2xhc3M9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkOiA8c3BhbiBjbGFzcz1cImhpZ2hsaWdodFwiIGRhdGEtYmluZD1cInRleHQ6ICRkYXRhXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiBkYXRhLWJpbmQ9XCJpZjogcmVxdWlyZXNWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaW5wdXRWYWx1ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlByb3ZpZGUgdGhlIHJlbGV2YW50IHZhbHVlIHRvIHVzZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlucHV0VmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBpbnB1dFZhbHVlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWxlY3RlZFNxbEZ1bmN0aW9uKCkgPT0gJ090aGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3VzdG9tLXNxbFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkN1c3RvbSBTUUwgRXhwcmVzc2lvbjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIHlvdXIgY3VzdG9tIFNRTCBFeHByZXNzaW9uIGJlbG93IGJ5IHNlbGVjdGluZyBkYXRhIGZpZWxkcywgYWRkaW5nIGNhbGN1bGF0aW9ucyBvciB1c2luZyBTUUwga2V5d29yZHMgYXMgbmVlZGVkLiBGb3Igc3RyaW5nIHZhbHVlcywgcmVtZW1iZXIgdG8gZW5jbG9zZSB0aGVtIGluIHNpbmdsZSBxdW90ZXMgKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGlkPVwiY3VzdG9tLXNxbFwiIGNsYXNzPVwiaGludC1pbnB1dFwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgY3VzdG9tIFNRTFwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IGlzQ29uZGl0aW9uYWxGdW5jdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIHlvdXIgY29uZGl0aW9uYWwgbG9naWMgYmVsb3cgYnkgc2VsZWN0aW5nIGRhdGEgZmllbGRzLCBhZGRpbmcgY2FsY3VsYXRpb25zIGFuZCBkZWZpbmluZyBjb25kaXRpb25zIGFzIG5lZWRlZCwgYW5kIHByb3ZpZGUgY29ycmVzcG9uZGluZyByZXN1bHRzLiBGb3Igc3RyaW5nIHZhbHVlcywgcmVtZW1iZXIgdG8gZW5jbG9zZSB0aGVtIGluIHNpbmdsZSBxdW90ZXMgKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi1maWVsZFwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIkZpZWxkIHRvIGNvbXBhcmVcIiB0aXRsZT1cIkZpZWxkIHRvIGNvbXBhcmVcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiIHN0eWxlPVwid2lkdGg6IDEyMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZU9wZXJhdG9ycywgdmFsdWU6IHNlbGVjdGVkT3BlcmF0b3JcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludC1pbnB1dFwiIGlkPVwiY29uZGl0aW9uLXZhbHVlXCIgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiVmFsdWUgdG8gY29tcGFyZVwiIHRpdGxlPVwiVmFsdWUgdG8gY29tcGFyZVwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiIHN0eWxlPVwibWF4LWhlaWdodDogMzJweDtcIj5USEVOPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludC1pbnB1dFwiIGlkPVwiY29uZGl0aW9uLXJlc3VsdFwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIkNvbmRpdGlvbiBSZXN1bHRcIiB0aXRsZT1cIkNvbmRpdGlvbiBSZXN1bHRcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkQ29uZGl0aW9uXCI+QWRkIENvbmRpdGlvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIG10LTNcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBjb25kaXRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGNvbmRpdGlvbkRpc3BsYXlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZUNvbmRpdGlvblwiPlJlbW92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMnB4O1wiPkVMU0U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi1lbHNlXCIgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiRGVmYXVsdCBSZXN1bHRcIiB0aXRsZT1cIkRlZmF1bHQgUmVzdWx0XCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8aHIgLz5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIiB0aXRsZT1cIlNhdmUgQ3VzdG9tIEZvcm11bGEgRmllbGRcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUZvcm11bGFGaWVsZCwgdmlzaWJsZTogaXNGb3JtdWxhRmllbGRcIj5TYXZlPC9hPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHRpdGxlPVwiQ3VzdG9tIEZpZWxkIHVzaW5nIEZvcm11bGFcIiBkYXRhLWJpbmQ9XCJjbGljazogY2FuY2VsRm9ybXVsYUZpZWxkLCB0ZXh0OiBpc0Zvcm11bGFGaWVsZCgpPyAnQ2FuY2VsJzogJ0N1c3RvbWl6ZScsIGNzczogeydidG4tcHJpbWFyeSc6ICFpc0Zvcm11bGFGaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRm9ybXVsYUZpZWxkfVwiPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWRlc2lnbmVyLWNvbXBhY3RcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkZXNpZ25lci1jb250YWluZXIgY29tcGFjdC1kZXNpZ25lclwiIGlkPVwiY2hvb3NlLWRhdGEtZGVzaWduXCIgc3R5bGU9XCJmb250LXNpemU6MTJweDtcIj5cclxuXHJcbiAgICAgIDwhLS0gVmlzdWFsaXphdGlvbiBUb29sYmFyIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTEgbWItMlwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvaT4gVmlzdWFsaXphdGlvbjwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRJRCgpLCBjbGljazogZnVuY3Rpb24oKSB7YWN0aXZlRGVzaWduKGZhbHNlKTt9XCIgdGl0bGU9XCJDbG9zZVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRpbWVzXCI+PC9pPiBDbG9zZSBEZXNpZ25lclxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1jaG9vc2UtdmlzdWFsJ1wiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTWFpbiBHcmlkIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBnYXAtMiBjb21wYWN0LWZpbHRlcnMgbmVlZHMtdmFsaWRhdGlvblwiPlxyXG5cclxuICAgICAgICA8IS0tIERhdGEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImRhdGFQYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOiAzMDBweFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2RhdGFQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdkYXRhUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kYXRhYmFzZVwiPjwvaT4gRGF0YVxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItY2hvb3NlLWRhdGEnXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTZWxlY3RlZCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwic2VsZWN0ZWRQYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOiA0MDBweFwiXHJcbiAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc2VsZWN0ZWRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzZWxlY3RlZFBhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGFibGVcIj48L2k+IFNlbGVjdGVkIGRhdGEgZm9yIHRoZSBSZXBvcnRcclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWQgZmxvYXQtZW5kXCJcclxuICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmlzaWJsZTogU2VsZWN0ZWRGaWVsZHMoKS5sZW5ndGgsIGNsaWNrOmZ1bmN0aW9uKCl7U2VsZWN0ZWRGaWVsZHMoW10pO31cIj5DbGVhciBhbGw8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGRlc2lnbmVyLWF1dG8tdXBkYXRlIHAtMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1zZWxlY3RlZC1kYXRhJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwic3ViUmVwb3J0c1BhbmVsXCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc3ViUmVwb3J0c1BhbmVsJyl9LCB2aXNpYmxlOiBsaW5rZWRSZXBvcnRGaWVsZHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnc3ViUmVwb3J0c1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYm9va21hcmtcIj48L2k+IFN1YiBSZXBvcnRzXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc3ViLXJlcG9ydCcsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwiaHRtbFJlcG9ydFBhbmVsXCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnaHRtbFJlcG9ydFBhbmVsJyl9LCB2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ2h0bWxSZXBvcnRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbFwiPjwvaT4gQ3VzdG9tIERlc2lnblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLWh0bWwnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBDdXN0b20gRmllbGQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImN1c3RvbUZpZWxkUGFuZWxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWFnaWNcIj48L2k+IEN1c3RvbSBGaWVsZFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTEgY3VzdG9tLWZpZWxkLWRlc2lnblwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87IG92ZXJmbG93LXg6IGhpZGRlbjtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdjdXN0b20tZmllbGQtZGVzaWduZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpZWxkIE9wdGlvbnMgUGFuZWwgLS0+XHJcbiAgICAgICAgPGRpdiBpZD1cImZpZWxkT3B0aW9uc1BhbmVsXCIgY2xhc3M9XCJjYXJkIHAtMiBtdC0yIGNvbGxhcHNlXCI+XHJcbiAgICAgICAgPCEtLSBkeW5hbWljIGZpZWxkIHNldHRpbmdzIGxvYWQgaGVyZSAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpbHRlcnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImZpbHRlcnNQYW5lbFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2ZpbHRlcnNQYW5lbCcpfSwgaGlkZGVuOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdmaWx0ZXJzUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L2k+IEZpbHRlcnNcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTEgZGVzaWduZXItYXV0by11cGRhdGVcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MzAwcHg7IG92ZXJmbG93LXk6YXV0bztcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjp1c2VTdG9yZWRQcm9jXCI+PGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTp7bmFtZTonZmlsdGVyLXBhcmFtZXRlcnMnfVwiPjwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OnVzZVN0b3JlZFByb2NcIj48ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOntuYW1lOidmaWx0ZXItZ3JvdXAnfVwiPjwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU29ydCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwic29ydFBhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc29ydFBhbmVsJyl9LCBoaWRkZW46IHVzZVN0b3JlZFByb2MoKSB8fCBpc0Zvcm11bGFGaWVsZCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3NvcnRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNvcnRcIj48L2k+IFNvcnRcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTEgZGVzaWduZXItYXV0by11cGRhdGUgcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1zb3J0J1wiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2V0dGluZ3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNldHRpbmdzUGFuZWxcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdzZXR0aW5nc1BhbmVsJyl9LCBoaWRkZW46IGlzRm9ybXVsYUZpZWxkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3NldHRpbmdzUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1nZWFyXCI+PC9pPk9wdGlvbnNcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlXCI+PC9pPiBSZXBvcnQgTmFtZVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIlJlcG9ydCBOYW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6IFJlcG9ydE5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT4gUmVwb3J0IERlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIHJvd3M9XCIzXCIgcGxhY2Vob2xkZXI9XCJBZGRpdGlvbmFsIGRldGFpbHMgKG9wdGlvbmFsKVwiIGRhdGEtYmluZD1cInZhbHVlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IENhblNhdmVSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2F2ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFNhdmUgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogU2F2ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9wZW5cIj48L2k+IENob29zZSBGb2xkZXJcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogRm9sZGVycywgb3B0aW9uc1RleHQ6ICdGb2xkZXJOYW1lJywgb3B0aW9uc1ZhbHVlOiAnSWQnLCB2YWx1ZTogRm9sZGVySURcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1vcHRpb25zJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2NoZWR1bGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNjaGVkdWxlUGFuZWxcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdzY2hlZHVsZVBhbmVsJyl9XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3NjaGVkdWxlUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1ob3VyZ2xhc3NcIj48L2k+IFNjaGVkdWxlXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGRlc2lnbmVyLWF1dG8tdXBkYXRlIHJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1zY2hlZHVsZSd9XCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBY2Nlc3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImFjY2Vzc1BhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnYWNjZXNzUGFuZWwnKX0sIHZpc2libGU6IGFkbWluTW9kZSgpICYmICFpc0Zvcm11bGFGaWVsZCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ2FjY2Vzc1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEta2V5XCI+PC9pPlNlY3VyaXR5XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIlwiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlJywgZGF0YTogbWFuYWdlQWNjZXNzfVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxociAvPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWRlc2lnbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMHZoO1wiIGlkPVwicmVwb3J0LWRlc2lnbmVyLW1vZGFsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm15TW9kYWxMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPVwiTmVlZCBoZWxwIHNldHRpbmcgdXAgYSByZXBvcnQ/XCIgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vZG90bmV0cmVwb3J0LmNvbS9ibG9ncy9kb2NzL2Rlc2lnbmluZy1yZXBvcnRzXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1xdWVzdGlvbi1jaXJjbGVcIj48L3NwYW4+PC9hPiBEZXNpZ24geW91ciBSZXBvcnRcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6IG9uTW9kYWxDbG9zZUNsaWNrZWRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG5lZWRzLXZhbGlkYXRpb25cIiBzdHlsZT1cIm92ZXJmbG93LXk6IGF1dG87IGZsZXgtZ3JvdzogMTtcIj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIiBpZD1cImNob29zZS1kYXRhLWNhcmRcIiAgc3R5bGU9XCJtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjAwcHgpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvaT4gUmVwb3J0IE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiUmVwb3J0IE5hbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUmVwb3J0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT48c3BhbiBjbGFzcz1cImZhIGZhLWRhdGFiYXNlXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBEYXRhIGZvciBSZXBvcnQ8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLWNob29zZS1kYXRhJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+IFJlcG9ydCBEZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiByb3dzPVwiM1wiIHBsYWNlaG9sZGVyPVwiQWRkaXRpb25hbCBkZXRhaWxzIChvcHRpb25hbClcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUmVwb3J0RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBDYW5TYXZlUmVwb3J0cygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2F2ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9wZW5cIj48L2k+IENob29zZSBGb2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogRm9sZGVycywgb3B0aW9uc1RleHQ6ICdGb2xkZXJOYW1lJywgb3B0aW9uc1ZhbHVlOiAnSWQnLCB2YWx1ZTogRm9sZGVySURcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBWaXN1YWxpemF0aW9uPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1jaG9vc2UtdmlzdWFsJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogaXNGdW5jdGlvbkZpZWxkXCIgY2xhc3M9XCJjdXN0b20tZmllbGQtZGVzaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiIHRpdGxlPVwiU2F2ZSBDdXN0b20gRnVuY3Rpb24gRmllbGRcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUZ1bmN0aW9uRmllbGQsIHZpc2libGU6IGlzRnVuY3Rpb25GaWVsZFwiPlNhdmU8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNtXCIgdGl0bGU9XCJDdXN0b20gRmllbGQgdXNpbmcgRnVuY3Rpb25cIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXtpc0Z1bmN0aW9uRmllbGQoIWlzRnVuY3Rpb25GaWVsZCgpKX0sIHRleHQ6IGlzRnVuY3Rpb25GaWVsZCgpPyAnQ2FuY2VsJzogJ0Z1bmN0aW9uJywgY3NzOiB7J2J0bi1wcmltYXJ5JzogIWlzRnVuY3Rpb25GaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRnVuY3Rpb25GaWVsZH1cIj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBwYWRkZWQtZGl2XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNGdW5jdGlvbkZpZWxkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBhcmUgbm93IGNyZWF0aW5nIGEgQ3VzdG9taXplZCBGaWVsZCB1c2luZyBGdW5jdGlvbnMgYXZhaWxhYmxlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYUZpZWxkTGFiZWxcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkN1c3RvbSBGaWVsZCBMYWJlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5EYXRhIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFEYXRhRm9ybWF0XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlN0cmluZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5JbnRlZ2VyPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkRlY2ltYWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Q3VycmVuY3k8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkRhdGVUaW1lXCI+RGF0ZSBhbmQgVGltZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZm9ybXVsYURhdGFGb3JtYXQoKSA9PSAnRGVjaW1hbCcgfHwgZm9ybXVsYURhdGFGb3JtYXQoKSA9PSAnQ3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPlJvdW5kIHRvIERlY2ltYWwgUGxhY2VzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYURlY2ltYWxQbGFjZXNcIiBwbGFjZWhvbGRlcj1cIkNob29zZSBEZWNpbWFsIHBsYWNlcyAobGVhdmUgYmxhbmsgdG8gbm90IHVzZSByb3VuZGluZylcIiB0aXRsZT1cIkNob29zZSBEZWNpbWFsIHBsYWNlcyAobGVhdmUgYmxhbmsgdG8gbm90IHVzZSByb3VuZGluZylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgeW91ciBGdW5jdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmdW5jdGlvbi1jb2RlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGxhc3RQaWNrZWRGaWVsZCgpICYmIGxhc3RQaWNrZWRGaWVsZCgpLmZpZWxkVHlwZSA9PSAnSnNvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNj5TZWxlY3QgRGF0YSBGaWVsZHMgZnJvbSA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBsYXN0UGlja2VkRmllbGQoKS5maWVsZE5hbWVcIj48L3NwYW4+PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDoganNvbkZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tNCBjb2wteHMtNiBsaXN0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWRJbkFycmF5OiB7YXJyYXk6ICRwYXJlbnQuU2VsZWN0ZWRGaWVsZHMsIHZhbHVlOiAkZGF0YX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDoganNvbkNvbHVtbk5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJjdXN0b21GaWVsZFNlY3Rpb25cIiBkYXRhLWJpbmQ9XCJpZjogaXNGb3JtdWxhRmllbGRcIiBjbGFzcz1cImN1c3RvbS1maWVsZC1kZXNpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJ1aWxkIEN1c3RvbSBGaWVsZDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2N1c3RvbS1maWVsZC1kZXNpZ25lcidcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY29sLTggcHVsbC1sZWZ0XCI+PHNwYW4gY2xhc3M9XCJmYSBmYS10YWJsZVwiPjwvc3Bhbj4mbmJzcDtTZWxlY3RlZCBkYXRhIGZvciB0aGUgUmVwb3J0PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgcHVsbC1yaWdodCByaWdodC1hbGlnblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZFwiIGRhdGEtYmluZD1cInZpc2libGU6IFNlbGVjdGVkRmllbGRzKCkubGVuZ3RoLCBjbGljazogZnVuY3Rpb24oKSB7U2VsZWN0ZWRGaWVsZHMoW10pO31cIj5DbGVhciBhbGw8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc2VsZWN0ZWQtZGF0YSdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGxpbmtlZFJlcG9ydEZpZWxkcygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1ib29rbWFya1wiPjwvaT4gSW5jbHVkZSBTdWIgUmVwb3J0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc3ViLXJlcG9ydCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbFwiPjwvaT4gRGVzaWduIHlvdXIgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1odG1sJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L3NwYW4+Jm5ic3A7Q2hvb3NlIEZpbHRlcnM8L2g1PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTBweDsgb3ZlcmZsb3cteDogYXV0bztcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VTdG9yZWRQcm9jXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmaWx0ZXItcGFyYW1ldGVycyd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogdXNlU3RvcmVkUHJvY1wiIGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLWdyb3VwJ31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogRWRpdEZpbHRlcnNPblJlcG9ydFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBzZXR0aW5nIHVwIGFuZCBzYXZpbmcgZmlsdGVycyBvbiBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaGlkZGVuOiB1c2VTdG9yZWRQcm9jXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtc29ydFwiPjwvc3Bhbj4mbmJzcDtDaG9vc2UgU29ydGluZzwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc29ydCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnRcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1ob3VyZ2xhc3NcIj48L3NwYW4+Jm5ic3A7Q2hvb3NlIFNjaGVkdWxlPC9oNT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMHB4XCIgZGF0YS1iaW5kPVwiaWY6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1zY2hlZHVsZSd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItb3B0aW9ucydcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlJywgZGF0YTogbWFuYWdlQWNjZXNzfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGUsIGNsaWNrOiBSdW5SZXBvcnRTcWxQcmV2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb2RlXCI+PC9pPiBQcmV2aWV3IFJlcG9ydCBDb2RlXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiBjYW5jZWxDcmVhdGVSZXBvcnRcIj5DYW5jZWwgZWRpdGluZyBSZXBvcnQ8L2E+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnQoKSAmJiBDYW5TYXZlUmVwb3J0cygpLCBjbGljazogU2F2ZVdpdGhvdXRSdW5cIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+U2F2ZSBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1iaW5kPVwidGV4dDogU2F2ZVJlcG9ydCgpICYmIENhblNhdmVSZXBvcnRzKCk/ICdTYXZlICYgUnVuIFJlcG9ydCc6ICdSdW4gUmVwb3J0JywgY2xpY2s6IFJ1blJlcG9ydFwiPlJ1biBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJjaGFydC1zZXR0aW5nc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNoYXJ0LWNvbnRhaW5lciBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBjaGFydC1zZXR0aW5ncy1idG5cIlxyXG4gICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZUNoYXJ0U2V0dGluZ3NcIiB0aXRsZT1cIlJlcG9ydCBzZXR0aW5nc1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZ1wiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXNldHRpbmdzLXBhbmVsIGJvcmRlciBwLTIgc2hhZG93LXNtIGJnLWxpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd1NldHRpbmdzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1jbG9zZVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVDaGFydFNldHRpbmdzXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0wXCI+UmVwb3J0IFNldHRpbmdzPC9oNj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgbmF2LXNtIG1iLTIgc21hbGxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZSdcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJ0YWJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaHJlZjogJyNjaGFydFRhYi0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGhyZWY6ICcjdGFibGVUYWItJyArIFJlcG9ydElEKCkgfSwgY3NzOiB7IGFjdGl2ZTogIShSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnQgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZSBmYWRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogJ2NoYXJ0VGFiLScgKyBSZXBvcnRJRCgpIH0sIGNzczogeyAnc2hvdyBhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiQmFyIENoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIH0sIGNsaWNrOiBmdW5jdGlvbigpIHsgUmVwb3J0VHlwZSgnQmFyJyk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWJhci1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgdGl0bGU9XCJQaWUgQ2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2FjdGl2ZSc6IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfSwgY2xpY2s6IGZ1bmN0aW9uKCkgeyBSZXBvcnRUeXBlKCdQaWUnKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGllLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkxpbmUgQ2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2FjdGl2ZSc6IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnIH0sIGNsaWNrOiBmdW5jdGlvbigpIHsgUmVwb3J0VHlwZSgnTGluZScpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saW5lLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nQmFyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRIb3Jpem9udGFsXCIgLz4gSG9yaXpvbnRhbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRTdGFja2VkXCIgLz4gU3RhY2tlZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdQaWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBwaWVDaGFydERvbnV0XCIgLz4gRG9udXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nTGluZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGxpbmVDaGFydEFyZWFcIiAvPiBBcmVhPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QmFja2dyb3VuZCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmJhY2tncm91bmRDb2xvciwgYXR0cjogeyBwbGFjZWhvbGRlcjogJ1NlbGVjdCcgfSwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Gb250IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY2hhcnRPcHRpb25zKCkuZm9udENvbG9yLCBhdHRyOiB7IHBsYWNlaG9sZGVyOiAnU2VsZWN0JyB9LCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPlNlcmllcyBDb2xvcnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IGNoYXJ0T3B0aW9ucygpLnNlcmllc0NvbG9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWJveCBtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6ICRkYXRhLCBldmVudDogeyBpbnB1dDogZnVuY3Rpb24oZGF0YSwgZXZlbnQpIHsgJHBhcmVudC51cGRhdGVTZXJpZXNDb2xvcigkaW5kZXgoKSwgZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhbmdlciByZW1vdmUtY29sb3JcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVTZXJpZXNDb2xvclwiPiZ0aW1lczs8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbG9yLWJveCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkU2VyaWVzQ29sb3JcIiB0aXRsZT1cIkFkZCBTZXJpZXMgQ29sb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC03cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkxlZ2VuZCBQb3NpdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY2hhcnRPcHRpb25zKCkubGVnZW5kUG9zaXRpb24sIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyaWdodFwiPlJpZ2h0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInRvcFwiPlRvcDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib3R0b21cIj5Cb3R0b208L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Gb250IFNpemU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gZm9udC1zaXplLWlucHV0XCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmZvbnRTaXplLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkhPSdQaWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFydE9wdGlvbnMoKS5zaG93WEF4aXNMYWJlbCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+WC1BeGlzIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFydE9wdGlvbnMoKS5zaG93WUF4aXNMYWJlbCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+WS1BeGlzIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkgIT09ICdQaWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd0dyaWRsaW5lcywgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+R3JpZGxpbmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFydE9wdGlvbnMoKS5zaG93U21hbGxWYWx1ZXNPbkxhYmVsLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5TaG93IFNtYWxsIFZhbHVlcyBPbiBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+WS1BeGlzIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBwbGFjZWhvbGRlcj1cIiMsIyMwLjAwXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLnlBeGlzRm9ybWF0LCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgc21hbGwgbWItMSBkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlktQXhpcyBNaW48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLnlNaW4sIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlktQXhpcyBNYXg8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLnlNYXgsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YWJsZVRhYi0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHsgJ3Nob3cgYWN0aXZlJzogIShSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5IZWFkZXIgQmFjayBDb2xvcjwvbGFiZWw+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YmwtY29sb3ItcGlja2VyLScgKyBSZXBvcnRJRCgpfSAsIHZhbHVlOiB0YWJsZVNldHRpbmdzKCkuaGVhZGVyQmFja0NvbG9yLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZVRhYmxlIH1cIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkhlYWRlciBGb250IENvbG9yPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogJ3RibC1jb2xvci1waWNrZXItJyArIFJlcG9ydElEKCl9ICx2YWx1ZTogdGFibGVTZXR0aW5ncygpLmhlYWRlckZvbnRDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Sb3cgQmFjayBDb2xvcjwvbGFiZWw+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YmwtY29sb3ItcGlja2VyLScgKyBSZXBvcnRJRCgpfSAsdmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5yb3dCYWNrQ29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Um93IEZvbnQgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGJsLWNvbG9yLXBpY2tlci0nICsgUmVwb3J0SUQoKX0gLHZhbHVlOiB0YWJsZVNldHRpbmdzKCkucm93Rm9udENvbG9yLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZVRhYmxlIH1cIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5BbHQgUm93IEJhY2sgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogdGFibGVTZXR0aW5ncygpLmFsdFJvd0JhY2tDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5BbHQgUm93IEZvbnQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogdGFibGVTZXR0aW5ncygpLmFsdFJvd0ZvbnRDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi0yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Qm9yZGVyczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZC1mbGV4IGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdGFibGVTZXR0aW5ncygpLmJvcmRlcignbm9uZScpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnbm9uZScgfVwiPk5vbmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxleC1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHRhYmxlU2V0dGluZ3MoKS5ib3JkZXIoJ2FsbCcpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnYWxsJyB9XCI+QWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyB0YWJsZVNldHRpbmdzKCkuYm9yZGVyKCdvdXRlcicpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnb3V0ZXInIH1cIj5PdXRzaWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyB0YWJsZVNldHRpbmdzKCkuYm9yZGVyKCdpbm5lcicpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnaW5uZXInIH1cIj5JbnNpZGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJvcmRlciBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5ib3JkZXJDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTYgZC1mbGV4IGFsaWduLWl0ZW1zLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIHNtYWxsIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBjbGVhclRhYmxlU2V0dGluZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJkcmlsbGRvd25Nb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBDaGFydERyaWxsRG93bkRhdGFcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5EcmlsbGRvd24gRGF0YTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZSBwdWxsLXJpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IERyaWxsRG93bkRhdGEgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgbWF4LWhlaWdodDogNTAwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBEcmlsbERvd25EYXRhLCBhdHRyOiB7Y2xhc3M6ICd0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZCAnICsgJHBhcmVudC5zZWxlY3RlZFN0eWxlKCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZCBzdHlsZT1cInBvc2l0aW9uOiBzdGlja3k7IHRvcDogLTFweDsgei1pbmRleDogMjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm5vLWhpZ2hsaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogQ29sdW1ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogZmllbGRJZCB9LCBjc3M6IHsncmlnaHQtYWxpZ24nOiBJc051bWVyaWN9LCBzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGgsICdiYWNrZ3JvdW5kLWNvbG9yJzogaGVhZGVyQmFja0NvbG9yIH0sIGhpZGRlbjogb3V0ZXJHcm91cFwiIHN0eWxlPVwiYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZpZWxkTGFiZWwyKCkgPyBmaWVsZExhYmVsMigpIDogKGZpZWxkTGFiZWwoKSA/IGZpZWxkTGFiZWwoKSA6IGZpZWxkTmFtZSksIHN0eWxlOiB7J2NvbG9yJzogaGVhZGVyRm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBoZWFkZXJGb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCd9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGRhdGEtYmluZD1cInZpc2libGU6IFJvd3MgJiYgUm93cy5sZW5ndGggPCAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46IENvbHVtbnMubGVuZ3RofVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZWNvcmRzIGZvdW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IFJvd3MgIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogSXRlbXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImhpZGRlbjogb3V0ZXJHcm91cCwgc3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6IGJhY2tDb2xvciwgJ2NvbG9yJzogZm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBmb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J3dpZHRoJzogZmllbGRXaWR0aCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBMaW5rVG8tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiBMaW5rVG99XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4gZGF0YS1iaW5kPVwiaHRtbDogZm9ybWF0dGVkVmFsXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmbm90OiBMaW5rVG8tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1jZW50ZXJlZFwiIGRhdGEtYmluZD1cIndpdGg6IHBhZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5saW5lIHNtYWxsIHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogcGFnZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJ1RvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXhzXCIgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmV4cG9ydEV4Y2VsXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI3NxbERyaWxsRG93bk1vZGFsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHJvb3QuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb2RlXCI+PC9zcGFuPiBWaWV3IENvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1yaWdodFwiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwic3FsTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5SZXBvcnQgQ29kZTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbihkYXRhLCBldmVudCkgeyBjb3B5U3FsVG9DbGlwYm9hcmQoZXZlbnQudGFyZ2V0KTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2xpcGJvYXJkXCI+PC9pPiZuYnNwO0NvcHlcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgcHVsbC1yaWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydFJlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlcG9ydFNxbENvZGVcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IG1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBzY3JvbGw7IGJvcmRlcjogMXB4IHNvbGlkOyBwYWRkaW5nOiAxMHB4O1wiIGNsYXNzPVwiYmctZGFyayB0ZXh0LWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZSBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnRTcWxcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj48L2NvZGU+PC9wcmU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInNxbERyaWxsRG93bk1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6Q2hhcnREcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5EcmlsbCBEb3duIFJlcG9ydCBDb2RlPC9oND5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7IGNvcHlTcWxUb0NsaXBib2FyZChldmVudC50YXJnZXQpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jbGlwYm9hcmRcIj48L2k+Jm5ic3A7Q29weVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZSBwdWxsLXJpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgZGF0YS1iaW5kPVwid2l0aDpEcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicmVwb3J0U3FsQ29kZVwiIHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgbWF4LWhlaWdodDogNTAwcHg7IG92ZXJmbG93LXk6IHNjcm9sbDsgYm9yZGVyOiAxcHggc29saWQ7IHBhZGRpbmc6IDEwcHg7XCIgY2xhc3M9XCJiZy1kYXJrIHRleHQtbGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydFNxbFwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPjwvY29kZT48L3ByZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJub2FjY291bnRNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5BY2NvdW50IG5vdCBTZXR1cDwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5kb3RuZXQgUmVwb3J0IEFjY291bnQgQ29uZmlndXJhdGlvbiBtaXNzaW5nITwvcD5cclxuICAgICAgICAgICAgICAgIDxwPllvdSBkbyBub3QgaGF2ZSB0aGUgbmVjY2Vzc2FyeSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gY29tcGxldGVkIHRvIHVzZSBkb3RuZXQgUmVwb3J0LjwvcD5cclxuICAgICAgICAgICAgICAgIDxwPlBsZWFzZSB2aWV3IHRoZSA8YSBocmVmPVwiaHR0cHM6Ly9kb3RuZXRyZXBvcnQuY29tL2Jsb2dzL2dldHRpbmctc3RhcnRlZC13aXRoLWRvdG5ldC1yZXBvcnQvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R2V0dGluZyBTdGFydGVkIEd1aWRlPC9hPiB0byBjb3JyZWN0bHkgY29uZmlndXJlIGRvdG5ldCBSZXBvcnQuPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInBkZi1vcHRpb25zLXNjaGVkdWxlLXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogUGRmUGFnZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicGRmT3B0aW9uc1NjaGVkdWxlTW9kYWxMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtbyBtZS0yXCI+PC9pPiBTZXQgUERGIFBhZ2UgU2l6ZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHJvdyBnLTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgUERGIHdpbGwgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIHNlbGVjdGVkIHBhZ2Ugc2l6ZS4gRW5zdXJlIHlvdXIgY29udGVudCBmaXRzIHdlbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBjb250ZW50IHdpZHRoIGV4Y2VlZHMgdGhlIHNlbGVjdGVkIHNpemUsIGl0IHdpbGwgZGVmYXVsdCB0byBMZXR0ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cIndvcmQtb3B0aW9ucy1zY2hlZHVsZS10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFdvcmRQYWdlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJwZGZPcHRpb25zU2NoZWR1bGVNb2RhbExhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlLXBkZi1vIG1lLTJcIj48L2k+IFNldCBXT1JEIFBhZ2UgU2l6ZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHJvdyBnLTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgV09SRCB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIFNhdmVcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJ3b3JkLW9wdGlvbnMtdGVtcGxhdGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogV29yZFBhZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIndvcmRPcHRpb25zTW9kYWxMYWJlbFwiPjxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtbyBtZS0yXCI+PC9pPiBFeHBvcnQgdG8gV09SRDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIExlZnQgU2lkZTogUGFnZSBQcmV2aWV3IFNWRyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSaWdodCBTaWRlOiBGb3JtIE9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgV29yZCB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgbWUtMVwiPjwvaT4gRG93bmxvYWQgV09SRFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInBkZi1vcHRpb25zLXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogUGRmUGFnZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicGRmT3B0aW9uc01vZGFsTGFiZWxcIj48aSBjbGFzcz1cImZhIGZhLWZpbGUtcGRmLW8gbWUtMlwiPjwvaT4gRXhwb3J0IHRvIFBERjwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIExlZnQgU2lkZTogUGFnZSBQcmV2aWV3IFNWRyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSaWdodCBTaWRlOiBGb3JtIE9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgUERGIHdpbGwgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIHNlbGVjdGVkIHBhZ2Ugc2l6ZS4gRW5zdXJlIHlvdXIgY29udGVudCBmaXRzIHdlbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBjb250ZW50IHdpZHRoIGV4Y2VlZHMgdGhlIHNlbGVjdGVkIHNpemUsIGl0IHdpbGwgZGVmYXVsdCB0byBMZXR0ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGRvd25sb2FkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZCBtZS0xXCI+PC9pPiBEb3dubG9hZCBQREZcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuYCk7XHJcbiAgICB0aGlzLmNkcmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBiaW5kV2luZG93UmVzaXplKHZtOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBfdm0gPSB2bTtcclxuICAgICQod2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIF92bS5kcmF3Q2hhcnQoKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmRHcmlkSW5pdCh2bTphbnkpOiB2b2lkIHtcclxuICAgIGxldCBfdm0gPSB2bTtcclxuXHJcbiAgICAkKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKCcuZ3JpZC1zdGFjaycpLnNob3coKTtcclxuICAgICAgICB2YXIgZ3JpZCA9IEdyaWRTdGFjay5pbml0KHtcclxuICAgICAgICAgICAgY2VsbEhlaWdodDogNjAsXHJcbiAgICAgICAgICAgIHZlcnRpY2FsTWFyZ2luOiAxMCxcclxuICAgICAgICAgICAgcmVzaXphYmxlOiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVzOiAnc2UsIHN3LCBuZSwgbncsIG4sIGUsIHMsIHcnIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ3JpZC5vbignY2hhbmdlJywgZnVuY3Rpb24oZXZlbnQ6IGFueSwgaXRlbXM6IGFueVtdKSB7XHJcbiAgICAgICAgICBpZiAoaXRlbXMpIHtcclxuICAgICAgICAgICAgXy5mb3JFYWNoKGl0ZW1zLCBmdW5jdGlvbih4OiBhbnkpIHtcclxuICAgICAgICAgICAgICBfdm0udXBkYXRlUG9zaXRpb24oeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdyaWQub24oJ3Jlc2l6ZXN0b3AnLCBmdW5jdGlvbihldmVudDogeyB0YXJnZXQ6IGFueTsgfSwgaXRlbTogeyBzaXplOiB7IGhlaWdodDogbnVtYmVyOyB9OyB9KSB7XHJcbiAgICAgICAgICAgIHZhciBlID0gJChldmVudC50YXJnZXQpLmZpbmQoJy5yZXBvcnQtY2hhcnQnKTtcclxuICAgICAgICAgICAgdmFyIGQgPSAkKGV2ZW50LnRhcmdldCkuZmluZCgndGFibGUnKTtcclxuICAgICAgICAgICAgaWYgKGUgJiYgIWQpIHtcclxuICAgICAgICAgICAgICAgX3ZtLmRyYXdDaGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICBcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdm0uZHJhd0NoYXJ0KCk7XHJcbiAgICAgICAgZ3JpZC5lbmFibGVNb3ZlKGZhbHNlKTtcclxuICAgICAgICBncmlkLmVuYWJsZVJlc2l6ZShmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICB9LCAxMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIFxyXG4gIH1cclxuICBcclxuICBcclxuICB9XHJcbiIsIjxkaXYgaWQ9XCJkb3QtbmV0LXJlcG9ydFwiIGNsYXNzPVwiYm9keS1jb250ZW50XCI+XHJcblxyXG48ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2FkbWluLW1vZGUtdGVtcGxhdGUnfSwgdmlzaWJsZTogYWxsb3dBZG1pblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBjdXJyZW50RGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIGZsZXgtZ3Jvdy0xXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogZGFzaGJvYXJkc1wiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGgyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInRleHQ6IG5hbWUsIGNsaWNrOiBmdW5jdGlvbigpIHsgJHBhcmVudC5zZWxlY3REYXNoYm9hcmQoaWQpO30sIGNzczogeyAnYWN0aXZlJzogJHBhcmVudC5jdXJyZW50RGFzaGJvYXJkKCkuaWQgPT09IGlkLCAnc2VsZWN0ZWQtdGFiJzogJHBhcmVudC5jdXJyZW50RGFzaGJvYXJkKCkuaWQgPT09IGlkIH1cIj48L2E+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgYWxpZ24taXRlbXMtZW5kIGdhcC0yIG10LTIgbXQtbWQtMCBib3JkZXItYm90dG9tXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMjFweDtcIj4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZHJvcGRvd24tdG9nZ2xlXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGVuY2lsLXNxdWFyZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NYW5hZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93biBkcm9wZG93bi1ob3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIGRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgbmV3UmVwb3J0KHRydWUpIH0sIHZpc2libGU6IGN1cnJlbnREYXNoYm9hcmQoKS5jYW5NYW5hZ2UgfHwgYWRtaW5Nb2RlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvc3Bhbj4gQWRkIE5ldyBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IG5ld1JlcG9ydChmYWxzZSkgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBlbmNpbFwiPjwvc3Bhbj4gQWRkIHVzaW5nIFN0YW5kYXJkIERlc2lnbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgbmV3UmVwb3J0KHRydWUpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1ib2x0XCI+PC9zcGFuPiBBZGQgdXNpbmcgU21hcnRlciBEZXNpZ25lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI2FkZC1kYXNoYm9hcmQtbW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogZWRpdERhc2hib2FyZCwgdmlzaWJsZTogY3VycmVudERhc2hib2FyZCgpLmNhbk1hbmFnZSB8fCBhZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FZGl0IERhc2hib2FyZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI2FkZC1kYXNoYm9hcmQtbW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogbmV3RGFzaGJvYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRhc2hib2FyZFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFkZCBhIE5ldyBEYXNoYm9hcmQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBSZWZyZXNoQWxsUmVwb3J0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UmVmcmVzaDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkcm9wZG93bi10b2dnbGVcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FeHBvcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHJldHVybiBhcHBTZXR0aW5ncy5zaG93UGFnZVNpemUgPyBFeHBvcnRBbGxQZGZSZXBvcnRzV2l0aFBhZ2VPcHRpb24oKSA6IEV4cG9ydEFsbFBkZlJlcG9ydHMoJycsJycpOyB9LCBoaWRkZW46IGFwcFNldHRpbmdzLnVzZUFsdFBkZlwiPjxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXBwU2V0dGluZ3Muc2hvd1BhZ2VTaXplID8gRXhwb3J0QWxsUGRmQWx0UmVwb3J0c1dpdGhQYWdlT3B0aW9uKCkgOiBFeHBvcnRBbGxQZGZBbHRSZXBvcnRzKCcnLCcnKTsgfSwgdmlzaWJsZTogYXBwU2V0dGluZ3MudXNlQWx0UGRmXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLXBkZi1vXCI+PC9pPiBQZGY8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogRXhwb3J0QWxsRXhjZWxSZXBvcnRzXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L2k+IEV4Y2VsPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGNhbkRyaWxsZG93blwiPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IEV4cG9ydEFsbEV4Y2VsRXhwYW5kZWRSZXBvcnRzXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L2k+IEV4Y2VsIChFeHBhbmRlZCk8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHJldHVybiBhcHBTZXR0aW5ncy5zaG93UGFnZVNpemUgPyBFeHBvcnRBbGxXb3JkUmVwb3J0c1dpdGhQYWdlT3B0aW9uKCkgOiBFeHBvcnRBbGxXb3JkUmVwb3J0cygnJywnJyk7fVwiPjxpIGNsYXNzPVwiZmEgZmEtZmlsZS13b3JkLW9cIj48L2k+IFdvcmQ8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogUHJpbnREYXNoYm9hcmRcIj48aSBjbGFzcz1cImZhIGZhLXByaW50XCI+PC9pPiBQcmludDwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGN1cnJlbnREYXNoYm9hcmQoKS5jYW5NYW5hZ2UgfHwgYWRtaW5Nb2RlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBpZD1cImFycmFuZ2UtbW9kZVwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGFycmFuZ2VEYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BcnJhbmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJjbGljazogem9vbU91dERhc2hib2FyZFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiWm9vbSBPdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaC1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHJlc2V0Wm9vbURhc2hib2FyZFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiUmVzZXQgWm9vbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29tcHJlc3NcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYmluZD1cImNsaWNrOiB6b29tSW5EYXNoYm9hcmRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIlpvb20gSW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaC1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGRhdGEtYmluZD1cInZpc2libGU6IGN1cnJlbnREYXNoYm9hcmRcIj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IGN1cnJlbnREYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgPHAgZGF0YS1iaW5kPVwidGV4dDogZGVzY3JpcHRpb25cIj48L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwicGFkZGVkLXRvcFwiPjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmx5LWZpbHRlci10ZW1wbGF0ZSd9XCI+PC9kaXY+XHJcbiAgICAgICAgPGJyIC8+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiY2VudGVyZWRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZGFzaGJvYXJkcygpLmxlbmd0aCA9PSAwIFwiPlxyXG4gICAgTm8gRGFzaGJvYXJkcyB5ZXQuIENsaWNrIGJlbG93IHRvIFN0YXJ0PGJyIC8+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1sZyBidG4tcHJpbWFyeVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNhZGQtZGFzaGJvYXJkLW1vZGFsXCI+PGkgY2xhc3M9XCJmYSBmYS1kYXNoYm9hcmRcIj48L2k+IENyZWF0ZSBhIE5ldyBEYXNoYm9hcmQ8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgbW9kYWwtZnVsbHNjcmVlblwiIGlkPVwiYWRkLWRhc2hib2FyZC1tb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJhZGQtZGFzaGJvYXJkLW1vZGFsLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCIgcm9sZT1cImRvY3VtZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBkYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImFkZC1kYXNoYm9hcmQtbW9kYWwtbGFiZWxcIj48c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBJZCgpID8gJ0VkaXQnIDogJ0FkZCdcIj48L3NwYW4+IERhc2hib2FyZDwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRyb290Lm9uTW9kYWxDbG9zZUNsaWNrZWRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNCBjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb2wtZm9ybS1sYWJlbFwiPk5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtdmFsPVwidHJ1ZVwiIGRhdGEtdmFsLXJlcXVpcmVkPVwiRGFzaGJvYXJkIE5hbWUgaXMgcmVxdWlyZWQuXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogTmFtZVwiIHBsYWNlaG9sZGVyPVwiRGFzaGJvYXJkIE5hbWUsIGUuZy4sIFNhbGVzLCBBY2NvdW50aW5nXCIgaWQ9XCJhZGQtZGFzaC1uYW1lXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbC1mb3JtLWxhYmVsXCI+RGVzY3JpcHRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBEZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgRGVzY3JpcHRpb24gZm9yIHRoZSBEYXNoYm9hcmRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00IGNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT48aSBjbGFzcz1cImZhIGZhLXBhcGVyY2xpcFwiPjwvaT4gQ2hvb3NlIFJlcG9ydHMgZm9yIHRoZSBEYXNoYm9hcmQ8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFJlcG9ydCBieSBOYW1lIG9yIERlc2NyaXB0aW9uLi4uXCIgZGF0YS1iaW5kPVwidGV4dElucHV0OiAkcGFyZW50LnNlYXJjaFJlcG9ydHNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5zZWFyY2hSZXBvcnRzKCkgJiYgJHBhcmVudC5yZXBvcnRzSW5TZWFyY2goKS5sZW5ndGg9PTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZXBvcnRzIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAkcGFyZW50LnNlYXJjaFJlcG9ydHMoKSAmJiAgJHBhcmVudC5yZXBvcnRzSW5TZWFyY2goKS5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogJHBhcmVudC5yZXBvcnRzSW5TZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0taGVhZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiB7J2ZhLWZpbGUnOiByZXBvcnRUeXBlPT0nTGlzdCcsICdmYS10aC1saXN0JzogcmVwb3J0VHlwZT09J1N1bW1hcnknLCAnZmEtYmFyLWNoYXJ0JzogcmVwb3J0VHlwZT09J0JhcicsICdmYS1waWUtY2hhcnQnOiByZXBvcnRUeXBlPT0nUGllJywgJ2ZhLWxpbmUtY2hhcnQnOiByZXBvcnRUeXBlPT0nTGluZScsICdmYS1nbG9iZSc6IHJlcG9ydFR5cGUgPT0nTWFwJywgJ2ZhLXdpbmRvdy1yZXN0b3JlJzogcmVwb3J0VHlwZT09J1RyZWVtYXAnLCAnZmEtY29kZSc6IHJlcG9ydFR5cGU9PSdIdG1sJ31cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRwdDsgY29sb3I6ICM4MDgwODBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJoaWdobGlnaHRlZFRleHQ6IHsgdGV4dDogcmVwb3J0TmFtZSwgaGlnaGxpZ2h0OiAkcGFyZW50LnNlYXJjaFJlcG9ydHMsIGNzczogJ2hpZ2hsaWdodCcgfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbS10ZXh0IHNtYWxsXCIgZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0RGVzY3JpcHRpb25cIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAhJHBhcmVudC5zZWFyY2hSZXBvcnRzKClcIiBjbGFzcz1cImxpc3QtZ3JvdXAgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6ICRwYXJlbnQucmVwb3J0c0FuZEZvbGRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiAnI2ZvbGRlci0nICsgZm9sZGVySWQgfVwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogbm9ybWFsO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mb2xkZXIgbWUtMiB0ZXh0LXNlY29uZGFyeVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UgbXQtMlwiIGRhdGEtYmluZD1cImF0dHI6IHtpZDogJ2ZvbGRlci0nICsgZm9sZGVySWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiByZXBvcnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1maWxlJzogcmVwb3J0VHlwZT09J0xpc3QnLCAnZmEtdGgtbGlzdCc6IHJlcG9ydFR5cGU9PSdTdW1tYXJ5JywgJ2ZhLWJhci1jaGFydCc6IHJlcG9ydFR5cGU9PSdCYXInLCAnZmEtcGllLWNoYXJ0JzogcmVwb3J0VHlwZT09J1BpZScsICdmYS1saW5lLWNoYXJ0JzogcmVwb3J0VHlwZT09J0xpbmUnLCAnZmEtZ2xvYmUnOiByZXBvcnRUeXBlID09J01hcCcsICdmYS13aW5kb3ctcmVzdG9yZSc6IHJlcG9ydFR5cGU9PSdUcmVlbWFwJywgJ2ZhLWNvZGUnOiByZXBvcnRUeXBlPT0nSHRtbCd9XCIgc3R5bGU9XCJmb250LXNpemU6IDE0cHQ7IGNvbG9yOiAjODA4MDgwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0TmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0RGVzY3JpcHRpb25cIj48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1PjxpIGNsYXNzPVwiZmEgZmEtaG91cmdsYXNzXCI+PC9pPiZuYnNwO0Nob29zZSBTY2hlZHVsZTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtc2NoZWR1bGUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmFkbWluTW9kZVwiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnbWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZScsIGRhdGE6IG1hbmFnZUFjY2Vzc31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiAkcm9vdC5kZWxldGVEYXNoYm9hcmQsIHZpc2libGU6IElkXCI+RGVsZXRlIERhc2hib2FyZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogJHJvb3Quc2F2ZURhc2hib2FyZFwiPlNhdmUgRGFzaGJvYXJkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJncmlkLXN0YWNrXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogcmVwb3J0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW1cIiBkYXRhLWJpbmQ9XCJhdHRyOiB7J2dzLXgnOiB4LCAnZ3MteSc6IHksICdncy13Jzogd2lkdGgsICdncy1oJzogaGVpZ2h0LCAnZ3MtYXV0by1wb3NpdGlvbic6IHRydWUsICdncy1pZCc6IFJlcG9ydElEfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgZGF0YS1iaW5kPVwiYXR0cjoge2NsYXNzOiAnY2FyZCAnICsgcGFuZWxTdHlsZSArICcgZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnfSwgY3NzOiB7IGV4cGFuZGVkOiBpc0V4cGFuZGVkIH0sIHN0eWxlOiB7IGJvcmRlcjogbm9EYXNoYm9hcmRCb3JkZXJzKCkgPyAnbm9uZScgOiAnJywgJ2JveC1zaGFkb3cnOiBub0Rhc2hib2FyZEJvcmRlcnMoKSA/ICdub25lJyA6ICcnIH1cIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRlZC1kaXZcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAwOyBtYXJnaW4tYm90dG9tOiAwO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJmYWxzZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLXZcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudSBzbWFsbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IEZseUZpbHRlcnMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVGbHlGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L3NwYW4+IEZpbHRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93biBkcm9wZG93bi1ob3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi1pdGVtXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIHJvbGU9XCJidXR0b25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBkYXRhLWJpbmQ9XCJjbGljazogZWRpdFJlcG9ydEFpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L3NwYW4+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IG9wZW5SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCI+PC9zcGFuPiBFZGl0IFN0YW5kYXJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZWRpdFJlcG9ydEFpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWJvbHRcIj48L3NwYW4+IEVkaXQgU21hcnRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duIGRyb3Bkb3duLWhvdmVyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvc3Bhbj4gRXhwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZEV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj4gRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGNhbkRyaWxsZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZEV4Y2VsV2l0aERyaWxsZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IEV4Y2VsIChFeHBhbmRlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmFwcFNldHRpbmdzLnNob3dQYWdlU2l6ZSA/IGZ1bmN0aW9uKCkgeyBsb2FkUGRmTW9kZWwoKSB9IDogZnVuY3Rpb24oKSB7ICRwYXJlbnQuYXBwU2V0dGluZ3MudXNlQWx0UGRmID8gZG93bmxvYWRQZGZBbHQoJycsJycpIDogZG93bmxvYWRQZGYoJycsJycpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvc3Bhbj4gUERGXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5hcHBTZXR0aW5ncy5zaG93UGFnZVNpemUgPyBmdW5jdGlvbigpIHsgbG9hZFdvcmRNb2RlbCgpfSA6IGZ1bmN0aW9uKCkgeyBkb3dubG9hZFdvcmQoJycsJycpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtd29yZC1vXCI+PC9zcGFuPiBXb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKSE9J1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiAnL0RvdE5ldFJlcG9ydD9saW5rZWRyZXBvcnQ9dHJ1ZSZub3BhcmVudD10cnVlJnJlcG9ydElkPScgKyBSZXBvcnRJRCgpIH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZvbGRlci1vcGVuXCI+PC9zcGFuPiBPcGVuIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1iaW5kPVwidmlzaWJsZTogQ2FuRWRpdCgpICYmIENhblNhdmVSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IFNhdmVXaXRob3V0UnVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1zYXZlXCI+PC9zcGFuPiBTYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmN1cnJlbnREYXNoYm9hcmQoKS5jYW5NYW5hZ2UgfHwgJHBhcmVudC5hZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7ICRwYXJlbnQucmVtb3ZlUmVwb3J0RnJvbURhc2hib2FyZChSZXBvcnRJRCgpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2xvc2VcIj48L3NwYW4+IFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgUmVmcmVzaFJlcG9ydChSZXBvcnRJRCgpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvc3Bhbj4gUmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuYWRtaW5Nb2RlLCBjbGljazogZ2V0Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvc3Bhbj4gUmVwb3J0IENvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInB1bGwtbGVmdFwiIGRhdGEtYmluZD1cInRleHQ6IFJlcG9ydE5hbWVcIj48L2gyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0RpcnR5XCIgY2xhc3M9XCJ0ZXh0LXdhcm5pbmcgc21hbGxcIiB0aXRsZT1cIllvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tbGlua1wiIGRhdGEtYmluZD1cInZpc2libGU6IENhbkVkaXQoKSAmJiBDYW5TYXZlUmVwb3J0cygpICYmIGlzRGlydHkoKSwgY2xpY2s6IFNhdmVXaXRob3V0UnVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2F2ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLWxpbmtcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRXhwYW5kXCI+PHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1leHBhbmQnOiAhaXNFeHBhbmRlZCgpLCAnZmEtbWludXMnOiBpc0V4cGFuZGVkKCkgfSwgdmlzaWJsZTogUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnICYmICFub0Rhc2hib2FyZEJvcmRlcnMoKVwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGFjdGl2ZURlc2lnbigpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWRlc2lnbmVyLWNvbXBhY3QnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGxpc3Qtb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBSZXBvcnRUeXBlKCkhPSdTaW5nbGUnICYmIFJlcG9ydFR5cGUoKSE9J0h0bWwnICYmIENhbkVkaXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdjaGFydC1zZXR0aW5ncycsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydERlc2NyaXB0aW9uLCB2aXNpYmxlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmx5LWZpbHRlci10ZW1wbGF0ZSd9LCB2aXNpYmxlOiBzaG93Rmx5RmlsdGVyc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIiBkYXRhLWJpbmQ9XCJpZm5vdDogbm9EYXNoYm9hcmRCb3JkZXJzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGxcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwiaWY6IHRvdGFsUmVjb3JkcygpPjEgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJ1RvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwiaWY6IHBhZ2VzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gUmVwb3J0IEJ1aWxkZXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbCBtb2RhbC1mdWxsc2NyZWVuXCIgaWQ9XCJtb2RhbC1yZXBvcnRidWlsZGVyXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cIm15TW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XCIgZGF0YS1iaW5kPVwid2l0aDogc2VsZWN0ZWRSZXBvcnRcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LWRlc2lnbmVyJywgZGF0YTogJGRhdGF9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBGaWVsZCBPcHRpb25zIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImZpZWxkT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBzZWxlY3RlZFJlcG9ydFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtZmllbGQtb3B0aW9ucycsIGRhdGE6ICRkYXRhfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gTGluayBFZGl0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImxpbmtNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogc2VsZWN0ZWRSZXBvcnRcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LWxpbmstZWRpdCcsIGRhdGE6ICRkYXRhfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGhpcyByZW5kZXJzIHRoZSB0ZW1wbGF0ZSAtLT5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwZGZPcHRpb25zU2NoZWR1bGVNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJwZGZPcHRpb25zU2NoZWR1bGVNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogZGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICdwZGYtb3B0aW9ucy1zY2hlZHVsZS10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhICB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG48IS0tIFRoaXMgcmVuZGVycyB0aGUgdGVtcGxhdGUgLS0+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwid29yZE9wdGlvbnNTY2hlZHVsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIndvcmRPcHRpb25zU2NoZWR1bGVNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogZGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICd3b3JkLW9wdGlvbnMtc2NoZWR1bGUtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJ3b3JkT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIndvcmRPcHRpb25zTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtYmluZD1cIndpdGg6IHNlbGVjdGVkUmVwb3J0XCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICd3b3JkLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSAgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwZGZPcHRpb25zTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwicGRmT3B0aW9uc01vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBzZWxlY3RlZFJlcG9ydFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAncGRmLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSAgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJleHBvcnRBbGxXb3JkT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4cG9ydEFsbFdvcmRPcHRpb25zTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtYmluZD1cIndpdGg6IGRhc2hib2FyZFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAnd29yZC1vcHRpb25zLXRlbXBsYXRlJywgZGF0YTogJGRhdGEgIH1cIj48L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZXhwb3J0QWxsUGRmT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4cG9ydEFsbFBkZk9wdGlvbnNNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogZGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICdwZGYtb3B0aW9ucy10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhICB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBUZW1wbGF0ZXMgLS0+XHJcbjxkaXYgW2lubmVySHRtbF09XCJyZXBvcnRUZW1wbGF0ZXNcIj48L2Rpdj5cclxuPCEtLSBUZW1wbGF0ZXMgLS0+XHJcblxyXG48L2Rpdj4iXX0=
|