@bnsights/bbsf-admin-portal 1.0.3 → 1.0.4
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/bundles/bnsights-bbsf-admin-portal.umd.js +19591 -20432
- package/bundles/bnsights-bbsf-admin-portal.umd.js.map +1 -1
- package/esm2015/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.js +2 -2
- package/esm2015/lib/Pages/configurations/configuration/configuration.component.js +407 -421
- package/esm2015/lib/Pages/departments/department/department.component.js +45 -83
- package/esm2015/lib/Pages/departments/department-info/department-info.component.js +85 -94
- package/esm2015/lib/Pages/departments/departments.module.js +4 -1
- package/esm2015/lib/Pages/helpCenter/help-center/help-center.component.js +224 -223
- package/esm2015/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.js +137 -146
- package/esm2015/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.js +136 -153
- package/esm2015/lib/Pages/home/home.component.js +32 -26
- package/esm2015/lib/Pages/home/home.module.js +5 -10
- package/esm2015/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.js +336 -317
- package/esm2015/lib/Pages/jobs/jobs/jobs.component.js +168 -227
- package/esm2015/lib/Pages/license/license/license.component.js +68 -99
- package/esm2015/lib/Pages/localizations/localizations.component.js +379 -341
- package/esm2015/lib/Pages/logs/log/log.component.js +18 -27
- package/esm2015/lib/Pages/lookups/lookup/lookup.component.js +297 -288
- package/esm2015/lib/Pages/lookups/lookup-group/lookup-group.component.js +143 -165
- package/esm2015/lib/Pages/lookups/lookup-item/lookup-item.component.js +234 -233
- package/esm2015/lib/Pages/lookups/lookups-routing.module.js +2 -2
- package/esm2015/lib/Pages/notifications/add/add.component.js +83 -76
- package/esm2015/lib/Pages/notifications/edit/edit.component.js +60 -63
- package/esm2015/lib/Pages/notifications/edit-email/edit-email.component.js +128 -126
- package/esm2015/lib/Pages/notifications/edit-sms/edit-sms.component.js +87 -85
- package/esm2015/lib/Pages/notifications/master-layouts/master-layouts.component.js +57 -58
- package/esm2015/lib/Pages/notifications/notifications-routing.module.js +1 -3
- package/esm2015/lib/Pages/notifications/notifications.module.js +3 -4
- package/esm2015/lib/Pages/notifications/template-info/template-info.component.js +232 -228
- package/esm2015/lib/Pages/notifications/templates/templates.component.js +347 -310
- package/esm2015/lib/Pages/providers/provider/provider.component.js +53 -52
- package/esm2015/lib/Pages/publicHolidays/public-holiday/public-holiday.component.js +268 -270
- package/esm2015/lib/Pages/roles/permission-set-info/permission-set-info.component.js +136 -152
- package/esm2015/lib/Pages/roles/permissions/permissions.component.js +182 -218
- package/esm2015/lib/Pages/roles/permissionsets/permissionsets.component.js +219 -254
- package/esm2015/lib/Pages/sectors/department-info/department-info.component.js +134 -142
- package/esm2015/lib/Pages/sectors/sector/sector.component.js +127 -144
- package/esm2015/lib/Pages/sectors/sector-info/sector-info.component.js +123 -139
- package/esm2015/lib/Pages/shared/Enums/ParticipantType.js +8 -0
- package/esm2015/lib/Pages/shared/Services/ConfigurationsService.service.js +15 -12
- package/esm2015/lib/Pages/shared/Services/DepartmentService.service.js +4 -5
- package/esm2015/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.js +10 -9
- package/esm2015/lib/Pages/shared/Services/HelpCenterService.service.js +10 -7
- package/esm2015/lib/Pages/shared/Services/ImpersonationRuleService.service.js +14 -8
- package/esm2015/lib/Pages/shared/Services/LicenseService.service.js +3 -3
- package/esm2015/lib/Pages/shared/Services/LogsService.js +1 -1
- package/esm2015/lib/Pages/shared/Services/LookupGroupsService.service.js +11 -5
- package/esm2015/lib/Pages/shared/Services/LookupService.service.js +31 -15
- package/esm2015/lib/Pages/shared/Services/PermissionSetService.service.js +18 -8
- package/esm2015/lib/Pages/shared/Services/PermissionsService.service.js +12 -9
- package/esm2015/lib/Pages/shared/Services/PublicHolidayService.service.js +9 -3
- package/esm2015/lib/Pages/shared/Services/SectorService.service.js +18 -13
- package/esm2015/lib/Pages/shared/Services/TemplateService.service.js +36 -29
- package/esm2015/lib/Pages/shared/Services/localizationsService.service .js +23 -13
- package/esm2015/lib/Pages/shared/Services/provider.service.js +5 -7
- package/esm2015/lib/Pages/shared/Services/userService.service.js +10 -2
- package/esm2015/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/Lookups/LookupItem.js +1 -1
- package/esm2015/lib/Pages/shared/models/Lookups/LookupModel.js +1 -2
- package/esm2015/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.js +1 -1
- package/esm2015/lib/Pages/users/users.component.js +397 -409
- package/esm2015/lib/masterlayout-routing.module.js +5 -4
- package/esm2015/lib/masterlayout.component.js +23 -32
- package/esm2015/lib/masterlayout.module.js +25 -19
- package/fesm2015/bnsights-bbsf-admin-portal.js +17328 -17584
- package/fesm2015/bnsights-bbsf-admin-portal.js.map +1 -1
- package/lib/Pages/configurations/configuration/configuration.component.d.ts +31 -27
- package/lib/Pages/departments/department/department.component.d.ts +12 -11
- package/lib/Pages/departments/department-info/department-info.component.d.ts +31 -28
- package/lib/Pages/helpCenter/help-center/help-center.component.d.ts +34 -32
- package/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.d.ts +31 -34
- package/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.d.ts +30 -35
- package/lib/Pages/home/home.component.d.ts +4 -4
- package/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.d.ts +43 -42
- package/lib/Pages/jobs/jobs/jobs.component.d.ts +56 -62
- package/lib/Pages/license/license/license.component.d.ts +25 -23
- package/lib/Pages/localizations/localizations.component.d.ts +77 -65
- package/lib/Pages/logs/log/log.component.d.ts +7 -11
- package/lib/Pages/lookups/lookup/lookup.component.d.ts +64 -59
- package/lib/Pages/lookups/lookup-group/lookup-group.component.d.ts +44 -45
- package/lib/Pages/lookups/lookup-item/lookup-item.component.d.ts +62 -56
- package/lib/Pages/notifications/add/add.component.d.ts +13 -11
- package/lib/Pages/notifications/edit/edit.component.d.ts +14 -14
- package/lib/Pages/notifications/edit-email/edit-email.component.d.ts +18 -20
- package/lib/Pages/notifications/edit-sms/edit-sms.component.d.ts +15 -16
- package/lib/Pages/notifications/master-layouts/master-layouts.component.d.ts +24 -25
- package/lib/Pages/notifications/notifications.module.d.ts +15 -16
- package/lib/Pages/notifications/template-info/template-info.component.d.ts +32 -32
- package/lib/Pages/notifications/templates/templates.component.d.ts +54 -46
- package/lib/Pages/providers/provider/provider.component.d.ts +13 -12
- package/lib/Pages/publicHolidays/public-holiday/public-holiday.component.d.ts +29 -27
- package/lib/Pages/roles/permission-set-info/permission-set-info.component.d.ts +39 -40
- package/lib/Pages/roles/permissions/permissions.component.d.ts +49 -54
- package/lib/Pages/roles/permissionsets/permissionsets.component.d.ts +53 -55
- package/lib/Pages/sectors/department-info/department-info.component.d.ts +41 -44
- package/lib/Pages/sectors/sector/sector.component.d.ts +35 -33
- package/lib/Pages/sectors/sector-info/sector-info.component.d.ts +40 -44
- package/lib/Pages/shared/Enums/ParticipantType.d.ts +6 -0
- package/lib/Pages/shared/Services/ConfigurationsService.service.d.ts +7 -8
- package/lib/Pages/shared/Services/DepartmentService.service.d.ts +2 -2
- package/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.d.ts +5 -5
- package/lib/Pages/shared/Services/HelpCenterService.service.d.ts +2 -1
- package/lib/Pages/shared/Services/ImpersonationRuleService.service.d.ts +5 -5
- package/lib/Pages/shared/Services/LicenseService.service.d.ts +2 -2
- package/lib/Pages/shared/Services/LookupGroupsService.service.d.ts +4 -4
- package/lib/Pages/shared/Services/LookupService.service.d.ts +14 -11
- package/lib/Pages/shared/Services/PermissionSetService.service.d.ts +8 -7
- package/lib/Pages/shared/Services/PermissionsService.service.d.ts +5 -6
- package/lib/Pages/shared/Services/PublicHolidayService.service.d.ts +2 -2
- package/lib/Pages/shared/Services/SectorService.service.d.ts +7 -7
- package/lib/Pages/shared/Services/TemplateService.service.d.ts +20 -19
- package/lib/Pages/shared/Services/localizationsService.service .d.ts +12 -11
- package/lib/Pages/shared/Services/provider.service.d.ts +1 -1
- package/lib/Pages/shared/Services/userService.service.d.ts +2 -0
- package/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.d.ts +0 -1
- package/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.d.ts +1 -1
- package/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.d.ts +0 -2
- package/lib/Pages/shared/models/Lookups/LookupModel.d.ts +1 -1
- package/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.d.ts +1 -1
- package/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.d.ts +1 -1
- package/lib/Pages/users/users.component.d.ts +54 -68
- package/lib/masterlayout.component.d.ts +4 -5
- package/lib/masterlayout.module.d.ts +8 -9
- package/package.json +3 -3
- package/src/lib/assets/sass/custom-styles.scss +115 -0
- package/src/lib/assets/sass/style-rtl.scss +2 -0
- package/src/lib/assets/sass/style.scss +2 -2
- package/esm2015/lib/Pages/notifications/edit-template/edit-template.component.js +0 -35
- package/lib/Pages/notifications/edit-template/edit-template.component.d.ts +0 -35
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
1
|
import { HttpParams } from '@angular/common/http';
|
|
3
2
|
import { Component, ViewChild } from '@angular/core';
|
|
4
3
|
import { FormGroup } from '@angular/forms';
|
|
5
|
-
import { AutocompleteOptions, DropdownOptions, FileUploadOptions, FileType, FilterItem, FilterType, InputType, PagingOptions, TextAreaOptions, TextBoxOptions, MultiLingualTextAreaOptions, EnglishArabicDTO } from '@bnsights/bbsf-controls';
|
|
4
|
+
import { AutocompleteOptions, DropdownOptions, FileUploadOptions, FileType, FilterItem, FilterType, InputType, PagingOptions, TextAreaOptions, TextBoxOptions, MultiLingualTextAreaOptions, EnglishArabicDTO, FormOptions, ConfirmationModalOptions, StyleConfirmationMode } from '@bnsights/bbsf-controls';
|
|
6
5
|
import { EditResourceModel } from '../shared/models/LocalizationModels/EditResourceModel';
|
|
7
6
|
import { UploadJsonVM } from '../shared/models/LocalizationModels/UploadJsonVM';
|
|
8
7
|
import { PageInfoService } from '../../_metronic/core/services/page-info.service';
|
|
9
8
|
import { saveAs } from 'file-saver';
|
|
10
9
|
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "
|
|
12
|
-
import * as i2 from "
|
|
10
|
+
import * as i1 from "../../_metronic/core/services/page-info.service";
|
|
11
|
+
import * as i2 from "@bnsights/bbsf-utilities";
|
|
13
12
|
import * as i3 from "@angular/common";
|
|
14
13
|
import * as i4 from "ngx-clipboard";
|
|
15
14
|
import * as i5 from "../shared/Services/localizationsService.service ";
|
|
@@ -18,75 +17,138 @@ import * as i7 from "ng-block-ui";
|
|
|
18
17
|
import * as i8 from "@bnsights/bbsf-controls";
|
|
19
18
|
import * as i9 from "@angular/material/menu";
|
|
20
19
|
import * as i10 from "../empty-data/empty-data.component";
|
|
21
|
-
import * as i11 from "
|
|
22
|
-
import * as i12 from "ng-inline-svg";
|
|
20
|
+
import * as i11 from "ng-inline-svg";
|
|
23
21
|
export class LocalizationsComponent {
|
|
24
|
-
constructor(
|
|
25
|
-
this.authService = authService;
|
|
22
|
+
constructor(pageInfoService, utilityService, environmentService, datePipe, _clipboardService, localizationsService, modalService, requestHandlerService) {
|
|
26
23
|
this.pageInfoService = pageInfoService;
|
|
27
24
|
this.utilityService = utilityService;
|
|
28
|
-
this.bbsfTranslateService = bbsfTranslateService;
|
|
29
25
|
this.environmentService = environmentService;
|
|
30
26
|
this.datePipe = datePipe;
|
|
31
27
|
this._clipboardService = _clipboardService;
|
|
32
28
|
this.localizationsService = localizationsService;
|
|
33
29
|
this.modalService = modalService;
|
|
34
|
-
this.
|
|
35
|
-
|
|
36
|
-
this.
|
|
30
|
+
this.requestHandlerService = requestHandlerService;
|
|
31
|
+
//Page requirements
|
|
32
|
+
this.ApiUrl = this.localizationsService.ApiUrl;
|
|
33
|
+
this.selectedLocalizationList = [];
|
|
34
|
+
this.resourceSetList = [];
|
|
37
35
|
this.filterForm = new FormGroup({});
|
|
38
|
-
this.
|
|
36
|
+
this.localizationForm = new FormGroup({});
|
|
39
37
|
this.showFilter = false;
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
38
|
+
this.localizationPagingResult = [];
|
|
39
|
+
this.filteredLocalizationPagingResult = [];
|
|
40
|
+
this.isFilterLoaded = false;
|
|
42
41
|
//Add Model Controls
|
|
43
|
-
this.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
this.
|
|
47
|
-
this.
|
|
42
|
+
this.addResourceForm = new FormGroup({});
|
|
43
|
+
this.editResourceForm = new FormGroup({});
|
|
44
|
+
//GenerateStronglyTypedClass
|
|
45
|
+
this.generateCodeForm = new FormGroup({});
|
|
46
|
+
this.valueToCopy = "";
|
|
48
47
|
//Upload Model Controls
|
|
49
|
-
this.
|
|
50
|
-
//delete
|
|
48
|
+
this.uploadJsonFileForm = new FormGroup({});
|
|
49
|
+
//delete Model Controls
|
|
51
50
|
this.deleteResourceList = [];
|
|
52
|
-
|
|
53
|
-
this.
|
|
54
|
-
this.
|
|
55
|
-
this.
|
|
56
|
-
this.
|
|
57
|
-
|
|
51
|
+
this.deleteControlLoaded = false;
|
|
52
|
+
this.exportControlLoaded = false;
|
|
53
|
+
this.reloadControlLoaded = false;
|
|
54
|
+
this.restToFactoryDefaultControlLoaded = false;
|
|
55
|
+
this.exportExcelFunction = (params) => {
|
|
56
|
+
return this.localizationsService.export(params);
|
|
57
|
+
};
|
|
58
|
+
this.onExportSuccessHandler = (result) => {
|
|
59
|
+
let FileDTO = result;
|
|
60
|
+
const file = new Blob([FileDTO], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
|
|
61
|
+
saveAs(file, `Localizations${this.datePipe.transform(new Date(), "dd-MM-YYYY hh:mm").toString()}.xlsx`);
|
|
62
|
+
let element = this.pagingElement;
|
|
63
|
+
element.UpdatePaging();
|
|
64
|
+
};
|
|
65
|
+
this.getAddResourceModal = () => {
|
|
66
|
+
let paramArray = [];
|
|
67
|
+
let ResultModel = this.addResourceForm.value;
|
|
68
|
+
let AddModel = new EditResourceModel();
|
|
69
|
+
AddModel.ResourceId = ResultModel.ResourceId;
|
|
70
|
+
AddModel.ResourceSet = ResultModel.ResourceSet.value;
|
|
71
|
+
AddModel.ValueEN = ResultModel.Value.EnglishTextAreaValue;
|
|
72
|
+
AddModel.ValueAR = ResultModel.Value.ArabicTextAreaValue;
|
|
73
|
+
AddModel.CommentAr = ResultModel.Comment.ArabicTextAreaValue;
|
|
74
|
+
AddModel.CommentEn = ResultModel.Comment.EnglishTextAreaValue;
|
|
75
|
+
paramArray.push(AddModel);
|
|
76
|
+
return paramArray;
|
|
77
|
+
};
|
|
78
|
+
this.getAddResourceFunction = (AddModel) => {
|
|
79
|
+
return this.localizationsService.addResource(AddModel);
|
|
80
|
+
};
|
|
81
|
+
this.getEditResourceModel = () => {
|
|
82
|
+
let paramArray = [];
|
|
83
|
+
let ResultModel = this.editResourceForm.value;
|
|
84
|
+
let EditModel = new EditResourceModel();
|
|
85
|
+
EditModel.ResourceId = this.editResourceId;
|
|
86
|
+
EditModel.ResourceSet = this.editResourceSet;
|
|
87
|
+
EditModel.ValueEN = ResultModel.Value.EnglishTextAreaValue;
|
|
88
|
+
EditModel.ValueAR = ResultModel.Value.ArabicTextAreaValue;
|
|
89
|
+
EditModel.CommentEn = ResultModel.Comment.EnglishTextAreaValue;
|
|
90
|
+
EditModel.CommentAr = ResultModel.Comment.ArabicTextAreaValue;
|
|
91
|
+
paramArray.push(EditModel);
|
|
92
|
+
return paramArray;
|
|
93
|
+
};
|
|
94
|
+
this.getEditResourceFunction = (EditModel) => {
|
|
95
|
+
return this.localizationsService.editResource(EditModel);
|
|
96
|
+
};
|
|
97
|
+
this.deleteResourceFunction = (resourceSet, resourceId) => {
|
|
98
|
+
return this.localizationsService.deleteResource(resourceSet, resourceId);
|
|
99
|
+
};
|
|
100
|
+
this.reloadResourceFunction = () => {
|
|
101
|
+
return this.localizationsService.reloadJsonFile();
|
|
102
|
+
};
|
|
103
|
+
this.restToFactoryDefaultFunction = () => {
|
|
104
|
+
return this.localizationsService.restToFactoryDefault();
|
|
105
|
+
};
|
|
106
|
+
this.getUploadModal = () => {
|
|
107
|
+
let paramArray = [];
|
|
108
|
+
let ResultModel = this.uploadJsonFileForm.value;
|
|
109
|
+
let ResourceModel = new UploadJsonVM();
|
|
110
|
+
ResourceModel.SelectedResourceSet = ResultModel.SelectedResourceSet;
|
|
111
|
+
ResourceModel.ResourcesFile = {
|
|
112
|
+
FileBase64: ResultModel["ResourcesFile"].File.FileBase64,
|
|
113
|
+
FileName: ResultModel["ResourcesFile"].File.FileName,
|
|
114
|
+
FileSizeInMB: ResultModel["ResourcesFile"].File.FileSizeInMB,
|
|
115
|
+
FileType: ResultModel["ResourcesFile"].File.FileType
|
|
116
|
+
};
|
|
117
|
+
paramArray.push(ResourceModel);
|
|
118
|
+
return paramArray;
|
|
119
|
+
};
|
|
120
|
+
this.getUploadFunction = (ResourceModel) => {
|
|
121
|
+
return this.localizationsService.uploadExcelFiles(ResourceModel);
|
|
122
|
+
};
|
|
123
|
+
this.onSuccessHandler = (result) => {
|
|
124
|
+
this.excelValidation = result.val;
|
|
125
|
+
let showButton = this.ShowResourceValidationModal;
|
|
126
|
+
showButton.click();
|
|
127
|
+
};
|
|
58
128
|
}
|
|
59
129
|
ngOnInit() {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
this.ngOnInit();
|
|
72
|
-
});
|
|
73
|
-
this.language = yield this.utilityService.getCurrentLanguage();
|
|
74
|
-
this.ProductionMode = this.environmentService.getProductionMode();
|
|
75
|
-
this.LoadDropdownLists();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
ReinitializeLocalizationPaging() {
|
|
79
|
-
let element = this.input;
|
|
80
|
-
element.ReinitializePaging();
|
|
81
|
-
}
|
|
82
|
-
UpdateLocalizationPaging() {
|
|
83
|
-
let element = this.input;
|
|
84
|
-
element.UpdatePaging();
|
|
130
|
+
//Page header (breadcrumb and title)
|
|
131
|
+
PageInfoService.PageTitle = this.utilityService.getResourceValue("Localization");
|
|
132
|
+
PageInfoService.PageBreadcrumbs = [
|
|
133
|
+
{ title: this.utilityService.getResourceValue("Home"), path: '/Admin/Home', isSeparator: false, isActive: false },
|
|
134
|
+
{ title: '', path: '', isSeparator: true, isActive: false }
|
|
135
|
+
];
|
|
136
|
+
this.pageInfoService.calculateTitle();
|
|
137
|
+
this.pageInfoService.calculateBreadcrumbs();
|
|
138
|
+
this.ProductionMode = this.environmentService.getProductionMode();
|
|
139
|
+
//initialize page
|
|
140
|
+
this.initializePage();
|
|
85
141
|
}
|
|
142
|
+
//Paging functions
|
|
86
143
|
setLocalizationListResult(result) {
|
|
87
|
-
this.
|
|
88
|
-
this.
|
|
89
|
-
|
|
144
|
+
this.localizationPagingResult = result;
|
|
145
|
+
this.filteredLocalizationPagingResult = this.localizationPagingResult;
|
|
146
|
+
}
|
|
147
|
+
resetFilters() {
|
|
148
|
+
this.localizationForm.controls["ResourceSet"].setValue([]);
|
|
149
|
+
this.localizationForm.controls["searchTextBox"].setValue(null);
|
|
150
|
+
let element = this.pagingElement;
|
|
151
|
+
element.ReinitializePaging();
|
|
90
152
|
}
|
|
91
153
|
selectAllLocalizationList(event, Localizations) {
|
|
92
154
|
if (event.target.checked) {
|
|
@@ -94,7 +156,7 @@ export class LocalizationsComponent {
|
|
|
94
156
|
const Localization = Localizations[index];
|
|
95
157
|
const element = document.getElementById("Localization-" + Localization.ResourceId);
|
|
96
158
|
element.setAttribute("checked", "checked");
|
|
97
|
-
this.
|
|
159
|
+
this.selectedLocalizationList.push(Localization);
|
|
98
160
|
}
|
|
99
161
|
}
|
|
100
162
|
if (!event.target.checked) {
|
|
@@ -103,7 +165,7 @@ export class LocalizationsComponent {
|
|
|
103
165
|
const element = document.getElementById("Localization-" + Localization.ResourceId);
|
|
104
166
|
element.removeAttribute("checked");
|
|
105
167
|
}
|
|
106
|
-
this.
|
|
168
|
+
this.selectedLocalizationList = [];
|
|
107
169
|
}
|
|
108
170
|
}
|
|
109
171
|
loadFilters() {
|
|
@@ -114,311 +176,293 @@ export class LocalizationsComponent {
|
|
|
114
176
|
this.showFilter = false;
|
|
115
177
|
}
|
|
116
178
|
}
|
|
117
|
-
|
|
118
|
-
this.localizationsService.
|
|
119
|
-
this.
|
|
179
|
+
initializePage() {
|
|
180
|
+
this.localizationsService.loadDropdown().subscribe((result) => {
|
|
181
|
+
this.resourceSetList = result;
|
|
120
182
|
// Resource Set Init
|
|
121
|
-
this.
|
|
122
|
-
this.
|
|
123
|
-
this.
|
|
124
|
-
this.
|
|
125
|
-
this.
|
|
126
|
-
this.
|
|
127
|
-
this.
|
|
183
|
+
this.resourceSetOptions = new DropdownOptions();
|
|
184
|
+
this.resourceSetOptions.Name = "ResourceSet";
|
|
185
|
+
this.resourceSetOptions.LabelKey = "ResourceSet";
|
|
186
|
+
this.resourceSetOptions.DataSource = this.resourceSetList;
|
|
187
|
+
this.resourceSetOptions.SingleSelection = true;
|
|
188
|
+
this.resourceSetOptions.AllowSearchFilter = true;
|
|
189
|
+
this.resourceSetOptions.Placeholder = "";
|
|
128
190
|
// TextBox inti
|
|
129
191
|
this.searchTextBox = new TextBoxOptions();
|
|
130
192
|
this.searchTextBox.Name = "searchTextBox";
|
|
131
193
|
this.searchTextBox.HideLabel = true;
|
|
132
194
|
this.searchTextBox.Type = InputType.Text;
|
|
133
195
|
this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByNameOrResourceID");
|
|
134
|
-
this.
|
|
135
|
-
this.
|
|
136
|
-
this.
|
|
137
|
-
this.
|
|
138
|
-
this.
|
|
139
|
-
this.
|
|
140
|
-
this.
|
|
141
|
-
this.
|
|
142
|
-
this.
|
|
143
|
-
this.
|
|
144
|
-
this.
|
|
145
|
-
this.
|
|
146
|
-
this.
|
|
147
|
-
this.
|
|
148
|
-
this.
|
|
149
|
-
this.
|
|
150
|
-
this.IsFilterLoaded = true;
|
|
196
|
+
this.resourceSetFilter = new FilterItem();
|
|
197
|
+
this.resourceSetFilter.FormControlName = "ResourceSet";
|
|
198
|
+
this.resourceSetFilter.ActionParameterName = "resourceSet";
|
|
199
|
+
this.resourceSetFilter.IsFormControl = true;
|
|
200
|
+
this.resourceSetFilter.FilterType = FilterType.DropdownList;
|
|
201
|
+
this.textInputFilter = new FilterItem();
|
|
202
|
+
this.textInputFilter.FormControlName = "searchTextBox";
|
|
203
|
+
this.textInputFilter.ActionParameterName = "resourceName";
|
|
204
|
+
this.textInputFilter.IsFormControl = true;
|
|
205
|
+
this.textInputFilter.FilterType = FilterType.TextBox;
|
|
206
|
+
this.localizationPaging = new PagingOptions();
|
|
207
|
+
this.localizationPaging.ActionPostURL = this.ApiUrl + 'GetLocalizationsByFilter';
|
|
208
|
+
this.localizationPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
|
|
209
|
+
this.localizationPaging.DropdownFiltersControlNames = ["ResourceSet"];
|
|
210
|
+
this.localizationPaging.Filters = [this.resourceSetFilter, this.textInputFilter];
|
|
211
|
+
this.isFilterLoaded = true;
|
|
151
212
|
});
|
|
152
213
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let element = this.input;
|
|
157
|
-
element.ReinitializePaging();
|
|
158
|
-
}
|
|
159
|
-
exportExcel(ExportAsTemplate = false) {
|
|
160
|
-
let UsersFormFilters = this.LocalizationForm.value;
|
|
214
|
+
///////////Start of Export part//////////////////////
|
|
215
|
+
showExportExcelModal(ExportAsTemplate = false) {
|
|
216
|
+
let paramArray = [];
|
|
161
217
|
let params = new HttpParams();
|
|
162
|
-
params = params.append("resourceSet", this.
|
|
163
|
-
params = params.append("resourceName", this.
|
|
218
|
+
params = params.append("resourceSet", this.localizationForm.controls["ResourceSet"].value == undefined ? "" : this.localizationForm.controls["ResourceSet"].value);
|
|
219
|
+
params = params.append("resourceName", this.localizationForm.controls["searchTextBox"].value == undefined ? "" : this.localizationForm.controls["searchTextBox"].value);
|
|
164
220
|
params = params.append("exportAsTemplate", ExportAsTemplate.toString());
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
221
|
+
paramArray.push(params);
|
|
222
|
+
this.exportControlLoaded = false;
|
|
223
|
+
this.exportConfirmationOptions = new ConfirmationModalOptions();
|
|
224
|
+
this.exportConfirmationOptions.ServiceSubmitFunction = this.exportExcelFunction;
|
|
225
|
+
this.exportConfirmationOptions.PagingReference = this.pagingElement;
|
|
226
|
+
this.exportConfirmationOptions.OnSuccessHandler = this.onExportSuccessHandler;
|
|
227
|
+
this.exportConfirmationOptions.ServiceSubmitModel = paramArray;
|
|
228
|
+
this.exportConfirmationOptions.ConfirmationBody = this.utilityService.getResourceValue("ExportResourcesConfirmation");
|
|
229
|
+
this.exportConfirmationOptions.ConfirmationHeader = this.utilityService.getResourceValue("ExportResources");
|
|
230
|
+
this.exportConfirmationOptions.SubmitButtonText = this.utilityService.getResourceValue("Export");
|
|
231
|
+
this.exportConfirmationOptions.StyleConfirmationMode = StyleConfirmationMode.Warning;
|
|
232
|
+
this.exportConfirmationOptions.SuccessNotificationMessage = this.utilityService.getResourceValue("SuccessMessage");
|
|
233
|
+
this.exportControlLoaded = true;
|
|
234
|
+
setTimeout(() => {
|
|
235
|
+
this.exportConfirmationControl.showModal();
|
|
236
|
+
}, 200);
|
|
171
237
|
}
|
|
238
|
+
///////////End of Export part//////////////////////
|
|
239
|
+
///////////// Start add Resource Part//////////////////////
|
|
172
240
|
showAddResourceModal(addResourceModal) {
|
|
173
241
|
this.utilityService.startBlockUI();
|
|
174
|
-
this.
|
|
175
|
-
this.
|
|
176
|
-
this.
|
|
177
|
-
this.
|
|
178
|
-
this.
|
|
179
|
-
this.
|
|
180
|
-
this.
|
|
181
|
-
this.
|
|
182
|
-
this.
|
|
183
|
-
this.
|
|
184
|
-
this.
|
|
185
|
-
this.
|
|
186
|
-
this.
|
|
187
|
-
this.
|
|
188
|
-
this.
|
|
189
|
-
this.
|
|
190
|
-
this.
|
|
191
|
-
this.
|
|
192
|
-
this.
|
|
193
|
-
this.
|
|
194
|
-
this.
|
|
195
|
-
this.
|
|
196
|
-
this.
|
|
197
|
-
this.
|
|
198
|
-
this.
|
|
242
|
+
this.addResourceForm = new FormGroup({});
|
|
243
|
+
this.addResourceFormOptions = new FormOptions();
|
|
244
|
+
this.addResourceFormOptions.FormGroup = this.addResourceForm;
|
|
245
|
+
this.addResourceFormOptions.GetModelFunction = this.getAddResourceModal;
|
|
246
|
+
this.addResourceFormOptions.ServiceSubmitFunction = this.getAddResourceFunction;
|
|
247
|
+
this.addResourceFormOptions.PagingReference = this.pagingElement;
|
|
248
|
+
this.resourceSet = new AutocompleteOptions();
|
|
249
|
+
this.resourceSet.Name = "ResourceSet";
|
|
250
|
+
this.resourceSet.LabelKey = "ResourceSet";
|
|
251
|
+
this.resourceSet.Type = InputType.Text;
|
|
252
|
+
this.resourceSet.IsRequired = true;
|
|
253
|
+
this.resourceSet.Value = null;
|
|
254
|
+
this.resourceSet.ActionURL = this.ApiUrl + "AutoCompleteResourceSet";
|
|
255
|
+
this.resourceId = new TextBoxOptions();
|
|
256
|
+
this.resourceId.Name = "ResourceId";
|
|
257
|
+
this.resourceId.LabelKey = "ResourceId";
|
|
258
|
+
this.resourceId.Type = InputType.Text;
|
|
259
|
+
this.resourceId.Value = null;
|
|
260
|
+
this.resourceId.IsRequired = true;
|
|
261
|
+
this.multiLingualValue = new MultiLingualTextAreaOptions();
|
|
262
|
+
this.multiLingualValue.Name = "Value";
|
|
263
|
+
this.multiLingualValue.ArabicLabelKey = "ValueInArabic";
|
|
264
|
+
this.multiLingualValue.EnglishLabelKey = "ValueInEnglish";
|
|
265
|
+
this.multiLingualValue.IsRequired = true;
|
|
266
|
+
this.multiLingualComment = new MultiLingualTextAreaOptions();
|
|
267
|
+
this.multiLingualComment.Name = "Comment";
|
|
268
|
+
this.multiLingualComment.ArabicLabelKey = "CommentInArabic";
|
|
269
|
+
this.multiLingualComment.EnglishLabelKey = "CommentInEnglish";
|
|
199
270
|
this.modalService.open(addResourceModal);
|
|
200
271
|
this.utilityService.stopBlockUI();
|
|
201
272
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
this.EditMultiLingualValue.Name = "Value";
|
|
234
|
-
this.EditMultiLingualValue.ArabicLabelKey = "ValueInArabic";
|
|
235
|
-
this.EditMultiLingualValue.EnglishLabelKey = "ValueInEnglish";
|
|
236
|
-
this.EditMultiLingualValue.IsRequired = true;
|
|
237
|
-
this.EditMultiLingualValue.Value = Value;
|
|
238
|
-
let Comment = new EnglishArabicDTO();
|
|
239
|
-
Comment.Arabic = Resource.commentAr;
|
|
240
|
-
Comment.English = Resource.commentEn;
|
|
241
|
-
this.EditMultiLingualComment = new MultiLingualTextAreaOptions();
|
|
242
|
-
this.EditMultiLingualComment.Name = "Comment";
|
|
243
|
-
this.EditMultiLingualComment.ArabicLabelKey = "CommentInArabic";
|
|
244
|
-
this.EditMultiLingualComment.EnglishLabelKey = "CommentInEnglish";
|
|
245
|
-
this.EditMultiLingualComment.IsRequired = true;
|
|
246
|
-
this.EditMultiLingualComment.Value = Comment;
|
|
247
|
-
this.modalService.open(EditResourceModal);
|
|
248
|
-
this.utilityService.stopBlockUI();
|
|
249
|
-
}
|
|
250
|
-
editResource() {
|
|
251
|
-
if (this.EditResourceForm.invalid) {
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
let ResultModel = this.EditResourceForm.value;
|
|
256
|
-
let ResourceModel = new EditResourceModel();
|
|
257
|
-
ResourceModel.ResourceId = this.resourceId;
|
|
258
|
-
ResourceModel.ResourceSet = this.resourceSet;
|
|
259
|
-
ResourceModel.ValueEN = ResultModel.Value.EnglishTextAreaValue;
|
|
260
|
-
ResourceModel.ValueAR = ResultModel.Value.ArabicTextAreaValue;
|
|
261
|
-
ResourceModel.CommentEn = ResultModel.Comment.EnglishTextAreaValue;
|
|
262
|
-
ResourceModel.CommentAr = ResultModel.Comment.ArabicTextAreaValue;
|
|
263
|
-
this.localizationsService.EditResource(ResourceModel).subscribe((result) => {
|
|
264
|
-
this.modalService.dismissAll();
|
|
265
|
-
let element = this.input;
|
|
266
|
-
element.UpdatePaging();
|
|
267
|
-
}, (error) => {
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
RestResourceToFactoryDefault(Resource) {
|
|
272
|
-
let ResourceModel = new EditResourceModel();
|
|
273
|
-
ResourceModel.ResourceId = Resource.resourceId;
|
|
274
|
-
ResourceModel.ResourceSet = Resource.resourceSet;
|
|
275
|
-
ResourceModel.ValueEN = "";
|
|
276
|
-
ResourceModel.ValueAR = "";
|
|
277
|
-
ResourceModel.CommentEn = "";
|
|
278
|
-
ResourceModel.CommentAr = "";
|
|
279
|
-
this.localizationsService.RestResourceToFactoryDefault(ResourceModel).subscribe((result) => {
|
|
280
|
-
let element = this.input;
|
|
281
|
-
element.UpdatePaging();
|
|
282
|
-
}, (error) => {
|
|
273
|
+
//////////// End of add Resource part///////////////////////
|
|
274
|
+
///////////Start of edit Resource part//////////////////////
|
|
275
|
+
showEditResourceModal(resource, editResourceModal) {
|
|
276
|
+
this.editResourceForm = new FormGroup({});
|
|
277
|
+
this.editResourceId = resource.resourceId;
|
|
278
|
+
this.editResourceSet = resource.resourceSet;
|
|
279
|
+
this.editResourceFormOptions = new FormOptions();
|
|
280
|
+
this.editResourceFormOptions.FormGroup = this.editResourceForm;
|
|
281
|
+
this.editResourceFormOptions.GetModelFunction = this.getEditResourceModel;
|
|
282
|
+
this.editResourceFormOptions.ServiceSubmitFunction = this.getEditResourceFunction;
|
|
283
|
+
this.editResourceFormOptions.PagingReference = this.pagingElement;
|
|
284
|
+
this.localizationsService.getResource(this.editResourceSet, this.editResourceId).subscribe((result) => {
|
|
285
|
+
let Resource = result.model;
|
|
286
|
+
let Value = new EnglishArabicDTO();
|
|
287
|
+
Value.Arabic = Resource.valueAR;
|
|
288
|
+
Value.English = Resource.valueEN;
|
|
289
|
+
this.editMultiLingualValue = new MultiLingualTextAreaOptions();
|
|
290
|
+
this.editMultiLingualValue.Name = "Value";
|
|
291
|
+
this.editMultiLingualValue.ArabicLabelKey = "ValueInArabic";
|
|
292
|
+
this.editMultiLingualValue.EnglishLabelKey = "ValueInEnglish";
|
|
293
|
+
this.editMultiLingualValue.IsRequired = true;
|
|
294
|
+
this.editMultiLingualValue.Value = Value;
|
|
295
|
+
let Comment = new EnglishArabicDTO();
|
|
296
|
+
Comment.Arabic = Resource.commentAr;
|
|
297
|
+
Comment.English = Resource.commentEn;
|
|
298
|
+
this.editMultiLingualComment = new MultiLingualTextAreaOptions();
|
|
299
|
+
this.editMultiLingualComment.Name = "Comment";
|
|
300
|
+
this.editMultiLingualComment.ArabicLabelKey = "CommentInArabic";
|
|
301
|
+
this.editMultiLingualComment.EnglishLabelKey = "CommentInEnglish";
|
|
302
|
+
this.editMultiLingualComment.Value = Comment;
|
|
303
|
+
this.modalService.open(editResourceModal);
|
|
283
304
|
});
|
|
284
305
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
this.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
this.
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
306
|
+
///////////End of edit Resource part//////////////////////
|
|
307
|
+
///////////Start of delete Resource part//////////////////////
|
|
308
|
+
showDeleteResourceModal(resource) {
|
|
309
|
+
this.deleteControlLoaded = false;
|
|
310
|
+
//array sent to service function
|
|
311
|
+
let paramArray = [];
|
|
312
|
+
paramArray.push(resource.resourceSet);
|
|
313
|
+
paramArray.push(resource.resourceId);
|
|
314
|
+
this.deleteConfirmationOptions = new ConfirmationModalOptions();
|
|
315
|
+
this.deleteConfirmationOptions.ServiceSubmitFunction = this.deleteResourceFunction;
|
|
316
|
+
this.deleteConfirmationOptions.ServiceSubmitModel = paramArray;
|
|
317
|
+
this.deleteConfirmationOptions.PagingReference = this.pagingElement;
|
|
318
|
+
this.deleteControlLoaded = true;
|
|
319
|
+
setTimeout(() => {
|
|
320
|
+
this.ConfirmationModalControl.showModal();
|
|
321
|
+
}, 200);
|
|
300
322
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
323
|
+
///////////End of delete Resource part//////////////////////
|
|
324
|
+
///////////Start of Reload Resource part//////////////////////
|
|
325
|
+
showReloadResourceModal() {
|
|
326
|
+
this.reloadControlLoaded = false;
|
|
327
|
+
this.reloadConfirmationOptions = new ConfirmationModalOptions();
|
|
328
|
+
this.reloadConfirmationOptions.ServiceSubmitFunction = this.reloadResourceFunction;
|
|
329
|
+
this.reloadConfirmationOptions.PagingReference = this.pagingElement;
|
|
330
|
+
this.reloadConfirmationOptions.ConfirmationBody = this.utilityService.getResourceValue("ReloadResourcesConfirmation");
|
|
331
|
+
this.reloadConfirmationOptions.ConfirmationHeader = this.utilityService.getResourceValue("ReloadResources");
|
|
332
|
+
this.reloadConfirmationOptions.SubmitButtonText = this.utilityService.getResourceValue("Reload");
|
|
333
|
+
this.reloadConfirmationOptions.StyleConfirmationMode = StyleConfirmationMode.Warning;
|
|
334
|
+
this.reloadConfirmationOptions.SuccessNotificationMessage = this.utilityService.getResourceValue("SuccessMessage");
|
|
335
|
+
this.reloadControlLoaded = true;
|
|
336
|
+
setTimeout(() => {
|
|
337
|
+
this.reloadConfirmationModalControl.showModal();
|
|
338
|
+
}, 200);
|
|
308
339
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
340
|
+
///////////End of Reload Resource part//////////////////////
|
|
341
|
+
///////////Start of RestToFactoryDefault part//////////////////////
|
|
342
|
+
showRestToFactoryDefault() {
|
|
343
|
+
this.restToFactoryDefaultControlLoaded = false;
|
|
344
|
+
this.restToFactoryDefaultConfirmationOptions = new ConfirmationModalOptions();
|
|
345
|
+
this.restToFactoryDefaultConfirmationOptions.ServiceSubmitFunction = this.restToFactoryDefaultFunction;
|
|
346
|
+
this.restToFactoryDefaultConfirmationOptions.PagingReference = this.pagingElement;
|
|
347
|
+
this.restToFactoryDefaultConfirmationOptions.ConfirmationBody = this.utilityService.getResourceValue("ResetToFactoryConfirmation");
|
|
348
|
+
this.restToFactoryDefaultConfirmationOptions.ConfirmationHeader = this.utilityService.getResourceValue("ResetToFactoryDefault");
|
|
349
|
+
this.restToFactoryDefaultConfirmationOptions.SubmitButtonText = this.utilityService.getResourceValue("Rest");
|
|
350
|
+
this.restToFactoryDefaultConfirmationOptions.StyleConfirmationMode = StyleConfirmationMode.Warning;
|
|
351
|
+
this.restToFactoryDefaultConfirmationOptions.SuccessNotificationMessage = this.utilityService.getResourceValue("SuccessMessage");
|
|
352
|
+
this.restToFactoryDefaultControlLoaded = true;
|
|
353
|
+
setTimeout(() => {
|
|
354
|
+
this.restConfirmationModalControl.showModal();
|
|
355
|
+
}, 200);
|
|
316
356
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
357
|
+
///////////End of RestToFactoryDefault part//////////////////////
|
|
358
|
+
///////////Start of GenerateStronglyTypedClass part//////////////////////
|
|
359
|
+
generateStronglyTypedClass(generateStronglyTypedModal) {
|
|
360
|
+
this.generateCodeForm = new FormGroup({});
|
|
361
|
+
this.localizationsService.generateStronglyTypedClass().subscribe((result) => {
|
|
362
|
+
var Value = result;
|
|
363
|
+
this.stronglyTypedClass = new TextAreaOptions();
|
|
364
|
+
this.stronglyTypedClass.Name = "GenerateCodeTextArea";
|
|
365
|
+
this.stronglyTypedClass.Value = Value.val.toString();
|
|
366
|
+
this.valueToCopy = Value.val.toString();
|
|
367
|
+
this.stronglyTypedClass.IsDisabled = true;
|
|
368
|
+
this.stronglyTypedClass.HideLabel = true;
|
|
369
|
+
this.stronglyTypedClass.Rows = 20;
|
|
370
|
+
this.stronglyTypedClass.Cols = 20;
|
|
371
|
+
this.stronglyTypedClass.MaxLength = 1000000;
|
|
372
|
+
this.modalService.open(generateStronglyTypedModal);
|
|
322
373
|
});
|
|
323
374
|
}
|
|
324
375
|
copyInputMessage() {
|
|
325
|
-
this._clipboardService.copy(this.
|
|
326
|
-
}
|
|
327
|
-
GenerateStronglyTypedClass(GenerateStronglyTypedModal) {
|
|
328
|
-
this.localizationsService.GenerateStronglyTypedClass().subscribe((result) => {
|
|
329
|
-
var Value = result;
|
|
330
|
-
this.StronglyTypedClass = new TextAreaOptions();
|
|
331
|
-
this.StronglyTypedClass.Name = "StronglyTypedClass";
|
|
332
|
-
this.StronglyTypedClass.Value = Value.val.toString();
|
|
333
|
-
this.ValueToCopy = Value.val.toString();
|
|
334
|
-
this.StronglyTypedClass.IsDisabled = true;
|
|
335
|
-
this.StronglyTypedClass.HideLabel = true;
|
|
336
|
-
this.StronglyTypedClass.Rows = 20;
|
|
337
|
-
this.StronglyTypedClass.Cols = 20;
|
|
338
|
-
this.StronglyTypedClass.MaxLength = 1000000;
|
|
339
|
-
this.modalService.open(GenerateStronglyTypedModal);
|
|
340
|
-
}, (error) => {
|
|
341
|
-
});
|
|
376
|
+
this._clipboardService.copy(this.valueToCopy.toString());
|
|
342
377
|
}
|
|
343
|
-
|
|
378
|
+
///////////End of GenerateStronglyTypedClass part//////////////////////
|
|
379
|
+
// RestResourceToFactoryDefault(Resource:any) {
|
|
380
|
+
// let ResourceModel = new EditResourceModel();
|
|
381
|
+
// ResourceModel.ResourceId = Resource.resourceId;
|
|
382
|
+
// ResourceModel.ResourceSet = Resource.resourceSet;
|
|
383
|
+
// ResourceModel.ValueEN = "";
|
|
384
|
+
// ResourceModel.ValueAR ="";
|
|
385
|
+
// ResourceModel.CommentEn = "";
|
|
386
|
+
// ResourceModel.CommentAr = "";
|
|
387
|
+
// this.localizationsService.RestResourceToFactoryDefault(ResourceModel).subscribe((result) => {
|
|
388
|
+
// let element = this.input as any;
|
|
389
|
+
// element.UpdatePaging();
|
|
390
|
+
// })
|
|
391
|
+
// }
|
|
392
|
+
// ReloadJsonFile() {
|
|
393
|
+
// this.localizationsService.ReloadJsonFile().subscribe((result) => {
|
|
394
|
+
// this.modalService.dismissAll();
|
|
395
|
+
// let element = this.input as any;
|
|
396
|
+
// element.UpdatePaging();
|
|
397
|
+
// }, (error) => {
|
|
398
|
+
// })
|
|
399
|
+
// }
|
|
400
|
+
// RestToFactoryDefault() {
|
|
401
|
+
// this.localizationsService.RestToFactoryDefault().subscribe((result) => {
|
|
402
|
+
// this.modalService.dismissAll();
|
|
403
|
+
// let element = this.input as any;
|
|
404
|
+
// element.UpdatePaging();
|
|
405
|
+
// }, (error) => {
|
|
406
|
+
// })
|
|
407
|
+
// }
|
|
408
|
+
// RestUnmodifiedToFactoryDefault() {
|
|
409
|
+
// this.localizationsService.RestUnmodifiedToFactoryDefault().subscribe((result) => {
|
|
410
|
+
// let element = this.input as any;
|
|
411
|
+
// element.UpdatePaging();
|
|
412
|
+
// }, (error) => {
|
|
413
|
+
// })
|
|
414
|
+
// }
|
|
415
|
+
///////////// Start Upload Resource Part//////////////////////
|
|
416
|
+
showUploadModal(uploadResourceModal) {
|
|
344
417
|
this.utilityService.startBlockUI();
|
|
345
|
-
this.
|
|
346
|
-
this.
|
|
347
|
-
this.
|
|
348
|
-
this.
|
|
349
|
-
this.
|
|
350
|
-
this.
|
|
351
|
-
this.
|
|
352
|
-
this.
|
|
353
|
-
this.
|
|
354
|
-
this.
|
|
355
|
-
this.
|
|
356
|
-
this.
|
|
357
|
-
this.
|
|
358
|
-
this.
|
|
359
|
-
this.
|
|
360
|
-
this.
|
|
418
|
+
this.uploadJsonFileForm = new FormGroup({});
|
|
419
|
+
this.uploadJsonFileFormOptions = new FormOptions();
|
|
420
|
+
this.uploadJsonFileFormOptions.FormGroup = this.uploadJsonFileForm;
|
|
421
|
+
this.uploadJsonFileFormOptions.GetModelFunction = this.getUploadModal;
|
|
422
|
+
this.uploadJsonFileFormOptions.ServiceSubmitFunction = this.getUploadFunction;
|
|
423
|
+
this.uploadJsonFileFormOptions.OnSuccessHandler = this.onSuccessHandler;
|
|
424
|
+
this.uploadJsonFileFormOptions.PagingReference = this.pagingElement;
|
|
425
|
+
this.uploadResourceSetOptions = new DropdownOptions();
|
|
426
|
+
this.uploadResourceSetOptions.Name = "SelectedResourceSet";
|
|
427
|
+
this.uploadResourceSetOptions.LabelKey = "ResourceSet";
|
|
428
|
+
this.uploadResourceSetOptions.DataSource = this.resourceSetList;
|
|
429
|
+
this.uploadResourceSetOptions.SingleSelection = true;
|
|
430
|
+
this.uploadResourceSetOptions.AllowSearchFilter = true;
|
|
431
|
+
this.uploadResourceSetOptions.Placeholder = "";
|
|
432
|
+
this.resourcesFileInput = new FileUploadOptions();
|
|
433
|
+
this.resourcesFileInput.Name = "ResourcesFile";
|
|
434
|
+
this.resourcesFileInput.LabelKey = "UploadFile";
|
|
435
|
+
this.resourcesFileInput.IsMultipleFile = false;
|
|
436
|
+
this.resourcesFileInput.FileUploadAcceptsTypes = [FileType.Excel];
|
|
437
|
+
this.resourcesFileInput.FileMaxSizeInMB = 10;
|
|
438
|
+
this.resourcesFileInput.IsRequired = true;
|
|
439
|
+
this.modalService.open(uploadResourceModal);
|
|
361
440
|
this.utilityService.stopBlockUI();
|
|
362
441
|
}
|
|
363
|
-
|
|
364
|
-
if (this.UploadJsonFileForm.invalid) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
let ResultModel = this.UploadJsonFileForm.value;
|
|
369
|
-
let ResourceModel = new UploadJsonVM();
|
|
370
|
-
ResourceModel.SelectedResourceSet = ResultModel.SelectedResourceSet;
|
|
371
|
-
ResourceModel.ResourcesFile = {
|
|
372
|
-
FileBase64: ResultModel["ResourcesFile"][0].FileBase64,
|
|
373
|
-
FileName: ResultModel["ResourcesFile"][0].FileName,
|
|
374
|
-
FileSizeInMB: ResultModel["ResourcesFile"][0].FileSizeInMB,
|
|
375
|
-
FileType: ResultModel["ResourcesFile"][0].FileType
|
|
376
|
-
};
|
|
377
|
-
this.localizationsService.UploadExcelFiles(ResourceModel).subscribe((result) => {
|
|
378
|
-
let Result = result;
|
|
379
|
-
//console.log(Result)
|
|
380
|
-
this.ExcelValidation = Result.val;
|
|
381
|
-
this.modalService.dismissAll();
|
|
382
|
-
let element = this.input;
|
|
383
|
-
element.ReinitializePaging();
|
|
384
|
-
}, (error) => {
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
}
|
|
442
|
+
//////////// End of Upload Resource part///////////////////////
|
|
388
443
|
openResourceValidationModal(ResourceValidationModal) {
|
|
389
444
|
this.modalService.open(ResourceValidationModal);
|
|
390
445
|
}
|
|
391
446
|
confirmExcel() {
|
|
392
447
|
this.utilityService.notifySuccessMessage();
|
|
393
|
-
let element = this.
|
|
394
|
-
this.
|
|
448
|
+
let element = this.pagingElement;
|
|
449
|
+
this.initializePage();
|
|
395
450
|
this.modalService.dismissAll();
|
|
396
451
|
element.ReinitializePaging();
|
|
397
452
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
case 2:
|
|
408
|
-
this.HeaderMessage = this.utilityService.getResourceValue("ResetToFactoryDefault");
|
|
409
|
-
;
|
|
410
|
-
this.ConfirmationMessage = this.utilityService.getResourceValue("ResettoFactoryConfirmation");
|
|
411
|
-
this.ConfirmationModalType = 2;
|
|
412
|
-
break;
|
|
413
|
-
default:
|
|
414
|
-
break;
|
|
415
|
-
}
|
|
416
|
-
this.modalService.open(ConfirmationModal);
|
|
417
|
-
this.utilityService.stopBlockUI();
|
|
453
|
+
filterLocalizationList(searchValue) {
|
|
454
|
+
if (searchValue)
|
|
455
|
+
this.filteredLocalizationPagingResult = this.localizationPagingResult.filter(item => item.value.toLowerCase().includes(searchValue.toLowerCase()));
|
|
456
|
+
else
|
|
457
|
+
this.filteredLocalizationPagingResult = this.localizationPagingResult;
|
|
458
|
+
}
|
|
459
|
+
///////////Destroy Observable //////////////////////
|
|
460
|
+
ngOnDestroy() {
|
|
461
|
+
this.requestHandlerService.destroyHandler();
|
|
418
462
|
}
|
|
419
463
|
}
|
|
420
|
-
LocalizationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationsComponent, deps: [{ token: i1.
|
|
421
|
-
LocalizationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: LocalizationsComponent, selector: "lib-localizations", viewQueries: [{ propertyName: "CloseResourceModal", first: true, predicate: ["CloseResourceModal"], descendants: true }, { propertyName: "CloseEditResourceModal", first: true, predicate: ["CloseEditResourceModal"], descendants: true }, { propertyName: "EditResourceModal", first: true, predicate: ["EditResourceModal"], descendants: true }, { propertyName: "input", first: true, predicate: ["LocalizationPagingViewElement"], descendants: true }, { propertyName: "CloseUploadJsonFileModal", first: true, predicate: ["CloseUploadJsonFileModal"], descendants: true }, { propertyName: "CloseDeleteResourceModal", first: true, predicate: ["CloseDeleteResourceModal"], descendants: true }, { propertyName: "CloseConfirmationModal", first: true, predicate: ["CloseConfirmationModal"], descendants: true }, { propertyName: "ShowResourceValidationModal", first: true, predicate: ["ShowResourceValidationModal"], descendants: true }, { propertyName: "CloseResourceValidationModal", first: true, predicate: ["CloseResourceValidationModal"], descendants: true }], ngImport: i0, template: "<block-ui> </block-ui>\r\n <!-- Page Content -->\r\n <div *ngIf=\"ShowPageContent\" class=\"container-fluid\">\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-header border-0 pt-5\">\r\n <div class=\"card-title align-items-start flex-column\" *ngIf=\"IsFilterLoaded\">\r\n <form [formGroup]=\"LocalizationForm\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" [group]=\"LocalizationForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- begin::Menu -->\r\n\r\n <div ngbDropdown class=\"d-inline-block\" [ngStyle]=\"{'display': ShowPageContent==true?'block':'none'}\">\r\n <button ngbDropdownToggle href=\"javascript:;\" type=\"button\" class=\"btn btn-sm btn-light-primary me-3\" id=\"FiltersDropdown\" title=\"Filter\">\r\n <i class=\"fas fa-filter me-1\"></i>\r\n {{utilityService.getResourceValue(\"Filter\")}}\r\n </button>\r\n <div *ngIf=\"IsFilterLoaded\" ngbDropdownMenu aria-labelledby=\"FiltersDropdown\" class=\" filter-container menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-800 menu-state-bg-light-primary w-250px w-md-500px fw-bold py-3 \">\r\n <form [formGroup]=\"LocalizationForm\">\r\n <div class=\"px-7 py-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12\">\r\n <div class=\"mb-10\">\r\n <BBSF-DropdownList [options]=\"ResourceSetOptions\" [group]=\"LocalizationForm\"></BBSF-DropdownList>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-end\">\r\n <button class=\"btn btn-light btn-active-light-primary pv-reset btn-sm\" id=\"applyFiltersBtn\"\r\n (click)=\"resetFilters()\">\r\n {{utilityService.getResourceValue(\"Reset\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n <button (click)=\"exportExcel()\"\r\n title=\"Export\" type=\"button\" class=\"btn btn-sm btn-light-primary bnsights-btn-export me-3 \">\r\n <i class=\"fas fa-download me-1\"></i>\r\n {{utilityService.getResourceValue(\"Export\")}}\r\n </button>\r\n\r\n <button id=\"btnActivate\" type=\"button\" class=\"btn btn-sm btn-light-primary me-3 \" (click)=\"showConfirmationModal(1,ConfirmationModal)\">\r\n <i class=\"fas fa-sync-alt me-1\"></i>\r\n {{utilityService.getResourceValue(\"Reload\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary me-3 \" id=\"btnActivate\" (click)=\"ShowUploadModal(UploadJsonFileModal)\">\r\n <i class=\"fas fa-upload me-1\"></i>\r\n {{utilityService.getResourceValue(\"Upload\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary me-3\" (click)=\"showAddResourceModal(AddResourceModal)\">\r\n <i class=\"fas fa-plus me-1\"></i>\r\n {{utilityService.getResourceValue(\"Add\")}}\r\n </button>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menut\" class=\"btn btn-sm btn-primary me-3 btn-icon\" title=\"options\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <mat-menu #menut=\"matMenu\" class=\"py-3\">\r\n <button ngbDropdownItem type=\"button\" class=\"menu-item px-3\" (click)=\"showConfirmationModal(2,ConfirmationModal)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"RestToFactoryDefault\")}}</span>\r\n </button>\r\n <button ngbDropdownItem *ngIf=\"!ProductionMode\" type=\"button\" class=\"menu-item px-3\" (click)=\"GenerateStronglyTypedClass(GenerateStronglyTypedModal)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"GenerateStronglyTypedClass\")}} </span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <!-- end::Menu -->\r\n </div>\r\n </div>\r\n <!-- end::Header -->\r\n <!-- begin::Body -->\r\n <div class=\"card-body py-3\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ResourceId\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ResourceSet\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"English\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Arabic\")}}</th>\r\n <th class=\"min-w-50px\">{{utilityService.getResourceValue(\"Action\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let Localization of LocalizationPagingResult\">\r\n <td class=\"text-dark\">{{Localization.resourceId}}</td>\r\n <td>{{Localization.resourceSet}}</td>\r\n <td>{{Localization.valueEN}}</td>\r\n <td>{{Localization.valueAR}}</td>\r\n <td>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menu\" class=\"btn btn-sm btn-icon btn-light btn-active-light-primary\">\r\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <a ngbDropdownItem class=\"menu-item px-3\" (click)=\"showEditResourceModal(Localization,EditResourceModal)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"Edit\")}}</span>\r\n </a>\r\n <a ngbDropdownItem *ngIf=\"!ProductionMode\" class=\"menu-item px-3\" (click)=\"showDeleteResourceModal(Localization,deleteResourceModal)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"Delete\")}} </span>\r\n </a>\r\n </mat-menu>\r\n </div>\r\n\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"LocalizationPagingResult.length == 0\">\r\n <td colspan=\"5\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!--end::users list-->\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setLocalizationListResult($event)\" *ngIf=\"IsFilterLoaded\" [options]=\"LocalizationPaging\"\r\n [group]=\"LocalizationForm\" #LocalizationPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <!-- Add Modal -->\r\n <ng-template #AddResourceModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"AddResource\")}}</h1>\r\n </div>\r\n <form [formGroup]=\"AddResourceForm\" (ngSubmit)=\"addResource()\">\r\n <BBSF-AutocompleteTextBox [options]=\"ResourceSet\" [group]=\"AddResourceForm\">\r\n </BBSF-AutocompleteTextBox>\r\n <BBSF-TextBox [options]=\"ResourceId\" [group]=\"AddResourceForm\">\r\n </BBSF-TextBox>\r\n <BBSF-MultiLingualTextArea [options]=\"MultiLingualValue\" [group]=\"AddResourceForm\"></BBSF-MultiLingualTextArea>\r\n <BBSF-MultiLingualTextArea [options]=\"MultiLingualComment\" [group]=\"AddResourceForm\"></BBSF-MultiLingualTextArea>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseResourceModal id=\"CloseResourceModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Edit Modal -->\r\n <ng-template #EditResourceModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"EditResource\")}}</h1>\r\n </div>\r\n <form [formGroup]=\"EditResourceForm\" (ngSubmit)=\"editResource()\">\r\n <BBSF-MultiLingualTextArea [options]=\"EditMultiLingualValue\" [group]=\"EditResourceForm\"></BBSF-MultiLingualTextArea>\r\n <BBSF-MultiLingualTextArea [options]=\"EditMultiLingualComment\" [group]=\"EditResourceForm\"></BBSF-MultiLingualTextArea>\r\n\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseEditResourceModal id=\"CloseEditResourceModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Upload Modal -->\r\n <ng-template #UploadJsonFileModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"UploadResources\")}}</h1>\r\n </div>\r\n <div class=\"notice d-flex bg-light-primary rounded border-primary border border-dashed mb-10 p-6\">\r\n <!--begin::Icon-->\r\n <!--begin::Svg Icon | path: icons/duotune/general/gen044.svg-->\r\n <span class=\"svg-icon svg-icon-2tx svg-icon-primary me-4\">\r\n <span [inlineSVG]=\"'./src/assets/images/gen044.svg'\"></span>\r\n </span>\r\n <!--end::Svg Icon-->\r\n <!--end::Icon-->\r\n <!--begin::Wrapper-->\r\n <div class=\"d-flex flex-stack flex-grow-1\">\r\n <!--begin::Content-->\r\n <div class=\"fw-bold\">\r\n <div class=\"fs-6 text-gray-700\">\r\n {{utilityService.getResourceValue(\"UploadJsonResourcesInfo\")}}\r\n </div>\r\n </div>\r\n <!--end::Content-->\r\n </div>\r\n <!--end::Wrapper-->\r\n </div>\r\n <form [formGroup]=\"UploadJsonFileForm\" (ngSubmit)=\"UploadExcelFiles()\">\r\n <a [hidden]=\"true\" id=\"ShowResourceValidationModal\" href=\"javascript:;\" (click)=\"openResourceValidationModal(ResourceValidationModal)\">\r\n <i class=\"fa fa-history\"></i> {{utilityService.getResourceValue(\"show\")}}\r\n </a>\r\n <BBSF-FileUplaod [options]=\"ResourcesFileInput\" [group]=\"UploadJsonFileForm\">\r\n </BBSF-FileUplaod>\r\n <a id=\"btnDeactivate\" href=\"javascript:;\" (click)=\"exportExcel(true)\">\r\n {{utilityService.getResourceValue(\"DownloadResourceTemplateSheet\")}}\r\n </a>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseUploadJsonFileModal id=\"CloseUploadJsonFileModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n <!-- Delete Modal -->\r\n <ng-template #deleteResourceModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-sm btn-icon btn-active-color-primary\" (click)=\"modal.dismiss()\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"Delete\")}} {{utilityService.getResourceValue(\"Resource\")}}</h1>\r\n </div>\r\n <div class=\"notice d-flex bg-light-danger rounded border-danger border border-dashed mb-10 p-6\">\r\n <span class=\"svg-icon svg-icon-2tx svg-icon-danger me-4\">\r\n <span [inlineSVG]=\"'./src/assets/images/gen044.svg'\"></span>\r\n </span>\r\n\r\n <div class=\"d-flex flex-stack flex-grow-1\">\r\n <div class=\"fw-bold\">\r\n <div class=\"fs-6 text-gray-700\">\r\n {{utilityService.getResourceValue(\"Delete_Question\")}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button #CloseDeleteResourceModal id=\"CloseDeleteResourceModal\" type=\"button\"\r\n class=\"btn btn-light btn-sm me-3 \" data-dismiss=\"modal\" (click)=\"modal.dismiss()\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"deleteResource()\"\r\n class=\"btn btn-light-danger btn-sm \">\r\n {{utilityService.getResourceValue(\"Delete\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- GenerateStronglyTypedClass Modal -->\r\n <ng-template #GenerateStronglyTypedModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"GenerateCode\")}}</h1>\r\n </div>\r\n <form [formGroup]=\"GenerateCodeForm\">\r\n <div>\r\n <BBSF-TextArea [options]=\"StronglyTypedClass\" [group]=\"GenerateCodeForm\">\r\n </BBSF-TextArea>\r\n\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseStronglyTypedClassModal id=\"CloseStronglyTypedClassModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"copyInputMessage()\">\r\n {{utilityService.getResourceValue(\"CopyToClipboard\")}}\r\n </button>\r\n </div>\r\n </form>\r\n\r\n\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n <!-- Confirmation Message Modal -->\r\n <ng-template #ConfirmationModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{HeaderMessage}}</h1>\r\n </div>\r\n <div>\r\n {{ConfirmationMessage}}\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseConfirmationModal id=\"CloseConfirmationModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"button\" *ngIf=\"ConfirmationModalType==2\" (click)=\"RestToFactoryDefault()\"\r\n class=\"btn btn-danger btn-sm\">\r\n {{utilityService.getResourceValue(\"ResetToFactoryDefault\")}}\r\n </button>\r\n <button type=\"button\" *ngIf=\"ConfirmationModalType==1\" (click)=\"ReloadJsonFile()\"\r\n class=\"btn btn-danger btn-sm\">\r\n {{utilityService.getResourceValue(\"Reload\")}}\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Resource Validation Modal-->\r\n <ng-template #ResourceValidationModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"ResourcecheckResult\")}}</h1>\r\n </div>\r\n <div class=\"notice d-flex bg-light-warning rounded border-warning border border-dashed mb-10 p-6\">\r\n <!--begin::Icon-->\r\n <!--begin::Svg Icon | path: icons/duotune/general/gen044.svg-->\r\n <span class=\"svg-icon svg-icon-2tx svg-icon-warning me-4\">\r\n <span [inlineSVG]=\"'./src/assets/images/gen044.svg'\"></span>\r\n </span>\r\n <!--end::Svg Icon-->\r\n <!--end::Icon-->\r\n <!--begin::Wrapper-->\r\n <div class=\"d-flex flex-stack flex-grow-1\">\r\n <!--begin::Content-->\r\n <div class=\"fw-bold\">\r\n <div class=\"fs-6 text-gray-700\" *ngIf=\"!ExcelValidation.isValid\">\r\n <div>\r\n {{utilityService.getResourceValue(\"UpdatedEntriesNumber\")}} {{ExcelValidation.validCount}}\r\n </div>\r\n <div>\r\n {{utilityService.getResourceValue(\"InvalidEntriesNumber\")}} {{ExcelValidation.invalidCount}}\r\n </div>\r\n </div>\r\n <div class=\"fs-6 text-gray-700\" *ngIf=\"ExcelValidation.isValid\">\r\n {{utilityService.getResourceValue(\"AllEntriesValid\")}}\r\n </div>\r\n\r\n </div>\r\n <!--end::Content-->\r\n </div>\r\n <!--end::Wrapper-->\r\n </div>\r\n <div *ngIf=\"!ExcelValidation.isValid\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ResourceId\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ResourceSet\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ErrorMessage\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"fw-bold text-gray-600 border-0\">\r\n <tr class=\"trItem\" *ngFor=\"let Localization of ExcelValidation.invalidEntries\">\r\n <td class=\"text-dark\">\r\n {{Localization.resourceId}}\r\n </td>\r\n <td>{{Localization.resourceSet}}</td>\r\n <td>{{Localization.errorMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseResourceValidationModal id=\"CloseResourceValidationModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"button\" (click)=\"confirmExcel()\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n", styles: [".info{background-color:#e7f3fe;border-left:6px solid #2196F3}\n"], components: [{ type: i7.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i8.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i10.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i8.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i8.ɵq, selector: "BBSF-AutocompleteTextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵf, selector: "BBSF-MultiLingualTextArea", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵb, selector: "BBSF-FileUplaod", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵe, selector: "BBSF-TextArea", inputs: ["group", "options"], outputs: ["OnChange"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i6.NgbDropdown, selector: "[ngbDropdown]", inputs: ["open", "placement", "container", "autoClose", "display", "dropdownClass"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i6.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i6.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.InlineSVGDirective, selector: "[inlineSVG]", inputs: ["resolveSVGUrl", "replaceContents", "prepend", "injectComponent", "cacheSVG", "forceEvalStyles", "evalScripts", "inlineSVG", "setSVGAttributes", "removeSVGAttributes", "fallbackImgUrl", "onSVGLoaded"], outputs: ["onSVGInserted", "onSVGFailed"] }] });
|
|
464
|
+
LocalizationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationsComponent, deps: [{ token: i1.PageInfoService }, { token: i2.UtilityService }, { token: i2.EnvironmentService }, { token: i3.DatePipe }, { token: i4.ClipboardService }, { token: i5.localizationsService }, { token: i6.NgbModal }, { token: i2.RequestHandlerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
465
|
+
LocalizationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: LocalizationsComponent, selector: "lib-localizations", viewQueries: [{ propertyName: "pagingElement", first: true, predicate: ["LocalizationPagingViewElement"], descendants: true }, { propertyName: "ConfirmationModalControl", first: true, predicate: ["ConfirmationModalControl"], descendants: true }, { propertyName: "exportConfirmationControl", first: true, predicate: ["exportConfirmationControl"], descendants: true }, { propertyName: "reloadConfirmationModalControl", first: true, predicate: ["ReloadConfirmationModalControl"], descendants: true }, { propertyName: "restConfirmationModalControl", first: true, predicate: ["RestConfirmationModalControl"], descendants: true }, { propertyName: "ShowResourceValidationModal", first: true, predicate: ["ShowResourceValidationModal"], descendants: true }, { propertyName: "CloseResourceValidationModal", first: true, predicate: ["CloseResourceValidationModal"], descendants: true }], ngImport: i0, template: "<block-ui> </block-ui>\r\n <!-- Page Content -->\r\n <div class=\"container-fluid\">\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-header border-0 pt-5\">\r\n <div class=\"card-title align-items-start flex-column\" *ngIf=\"isFilterLoaded\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" (OnChange)=\"filterLocalizationList($event)\" [group]=\"localizationForm\"></BBSF-TextBox>\r\n \r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- begin::Menu -->\r\n\r\n <div ngbDropdown class=\"d-inline-block\">\r\n <button ngbDropdownToggle href=\"javascript:;\" type=\"button\" class=\"btn btn-sm btn-light-primary me-3\" id=\"FiltersDropdown\" title=\"Filter\">\r\n <i class=\"fas fa-filter me-1\"></i>\r\n {{utilityService.getResourceValue(\"Filter\")}}\r\n </button>\r\n <div *ngIf=\"isFilterLoaded\" ngbDropdownMenu aria-labelledby=\"FiltersDropdown\" class=\" filter-container menu menu-sub menu-sub-dropdown menu-column menu-rounded menu-gray-800 menu-state-bg-light-primary w-250px w-md-500px fw-bold py-3 \">\r\n <div class=\"px-7 py-5\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12\">\r\n <div class=\"mb-10\">\r\n <BBSF-DropdownList [options]=\"resourceSetOptions\" [group]=\"localizationForm\"></BBSF-DropdownList>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-end\">\r\n <button class=\"btn btn-light btn-active-light-primary pv-reset btn-sm\" id=\"applyFiltersBtn\"\r\n (click)=\"resetFilters()\">\r\n {{utilityService.getResourceValue(\"Reset\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <button (click)=\"showExportExcelModal()\"\r\n title=\"Export\" type=\"button\" class=\"btn btn-sm btn-light-primary bnsights-btn-export me-3 \">\r\n <i class=\"fas fa-download me-1\"></i>\r\n {{utilityService.getResourceValue(\"Export\")}}\r\n </button>\r\n\r\n <button id=\"btnActivate\" type=\"button\" class=\"btn btn-sm btn-light-primary me-3 \" (click)=\"showReloadResourceModal()\">\r\n <i class=\"fas fa-sync-alt me-1\"></i>\r\n {{utilityService.getResourceValue(\"Reload\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary me-3 \" id=\"btnActivate\" (click)=\"showUploadModal(UploadJsonFileModal)\">\r\n <i class=\"fas fa-upload me-1\"></i>\r\n {{utilityService.getResourceValue(\"Upload\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-primary me-3\" (click)=\"showAddResourceModal(AddResourceModal)\">\r\n <i class=\"fas fa-plus me-1\"></i>\r\n {{utilityService.getResourceValue(\"Add\")}}\r\n </button>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menut\" class=\"btn btn-sm btn-primary me-3 btn-icon\" title=\"options\">\r\n <i class=\"fa fa-bars\"></i>\r\n </button>\r\n <mat-menu #menut=\"matMenu\" class=\"py-3\">\r\n <button ngbDropdownItem type=\"button\" class=\"menu-item px-3\" (click)=\"showRestToFactoryDefault()\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"RestToFactoryDefault\")}}</span>\r\n </button>\r\n <button ngbDropdownItem *ngIf=\"!ProductionMode\" type=\"button\" class=\"menu-item px-3\" (click)=\"generateStronglyTypedClass(GenerateStronglyTypedModal)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"GenerateStronglyTypedClass\")}} </span>\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <!-- end::Menu -->\r\n </div>\r\n </div>\r\n <!-- end::Header -->\r\n <!-- begin::Body -->\r\n <div class=\"card-body py-3\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ResourceId\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ResourceSet\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Value\")}}</th>\r\n <th class=\"min-w-50px\">{{utilityService.getResourceValue(\"Action\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let Localization of filteredLocalizationPagingResult\">\r\n <td class=\"text-dark\">{{Localization.resourceId}}</td>\r\n <td>{{Localization.resourceSet}}</td>\r\n <td>{{Localization.value}}</td>\r\n <td>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menu\" class=\"btn btn-sm btn-icon btn-light btn-active-light-primary\">\r\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <a ngbDropdownItem class=\"menu-item px-3\" (click)=\"showEditResourceModal(Localization,EditResourceModal)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"Edit\")}}</span>\r\n </a>\r\n <a ngbDropdownItem *ngIf=\"!ProductionMode\" class=\"menu-item px-3\" (click)=\"showDeleteResourceModal(Localization)\">\r\n <span class=\"menu-link px-3\"> {{utilityService.getResourceValue(\"Delete\")}} </span>\r\n </a>\r\n </mat-menu>\r\n </div>\r\n\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"filteredLocalizationPagingResult.length == 0\">\r\n <td colspan=\"5\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!--end::users list-->\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setLocalizationListResult($event)\" *ngIf=\"isFilterLoaded\" [options]=\"localizationPaging\"\r\n [group]=\"localizationForm\" #LocalizationPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n <!-- Add Modal -->\r\n <ng-template #AddResourceModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"AddResource\")}}</h1>\r\n </div>\r\n <BBSF-Form [options]=\"addResourceFormOptions\">\r\n <BBSF-AutocompleteTextBox [options]=\"resourceSet\" [group]=\"addResourceForm\">\r\n </BBSF-AutocompleteTextBox>\r\n <BBSF-TextBox [options]=\"resourceId\" [group]=\"addResourceForm\">\r\n </BBSF-TextBox>\r\n <BBSF-MultiLingualTextArea [options]=\"multiLingualValue\" [group]=\"addResourceForm\"></BBSF-MultiLingualTextArea>\r\n <BBSF-MultiLingualTextArea [options]=\"multiLingualComment\" [group]=\"addResourceForm\"></BBSF-MultiLingualTextArea>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseResourceModal id=\"CloseResourceModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Edit Modal -->\r\n <ng-template #EditResourceModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"EditResource\")}}</h1>\r\n </div>\r\n <BBSF-Form [options]=\"editResourceFormOptions\">\r\n <BBSF-MultiLingualTextArea [options]=\"editMultiLingualValue\" [group]=\"editResourceForm\"></BBSF-MultiLingualTextArea>\r\n <BBSF-MultiLingualTextArea [options]=\"editMultiLingualComment\" [group]=\"editResourceForm\"></BBSF-MultiLingualTextArea>\r\n\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseEditResourceModal id=\"CloseEditResourceModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Upload Modal -->\r\n <ng-template #UploadJsonFileModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"UploadResources\")}}</h1>\r\n </div>\r\n <div class=\"notice d-flex bg-light-primary rounded border-primary border border-dashed mb-10 p-6\">\r\n <!--begin::Icon-->\r\n <!--begin::Svg Icon | path: icons/duotune/general/gen044.svg-->\r\n <span class=\"svg-icon svg-icon-2tx svg-icon-primary me-4\">\r\n <span [inlineSVG]=\"'./src/assets/images/gen044.svg'\"></span>\r\n </span>\r\n <!--end::Svg Icon-->\r\n <!--end::Icon-->\r\n <!--begin::Wrapper-->\r\n <div class=\"d-flex flex-stack flex-grow-1\">\r\n <!--begin::Content-->\r\n <div class=\"fw-bold\">\r\n <div class=\"fs-6 text-gray-700\">\r\n {{utilityService.getResourceValue(\"UploadJsonResourcesInfo\")}}\r\n </div>\r\n </div>\r\n <!--end::Content-->\r\n </div>\r\n <!--end::Wrapper-->\r\n </div>\r\n <BBSF-Form [options]=\"uploadJsonFileFormOptions\">\r\n <a [hidden]=\"true\" id=\"ShowResourceValidationModal\" href=\"javascript:;\" (click)=\"openResourceValidationModal(ResourceValidationModal)\">\r\n <i class=\"fa fa-history\"></i> {{utilityService.getResourceValue(\"show\")}}\r\n </a>\r\n <BBSF-FileUplaod [options]=\"resourcesFileInput\" [group]=\"uploadJsonFileForm\">\r\n </BBSF-FileUplaod>\r\n <a id=\"btnDeactivate\" href=\"javascript:;\" (click)=\"showExportExcelModal(true)\">\r\n {{utilityService.getResourceValue(\"DownloadResourceTemplateSheet\")}}\r\n </a>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseUploadJsonFileModal id=\"CloseUploadJsonFileModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n\r\n <!-- GenerateStronglyTypedClass Modal -->\r\n <ng-template #GenerateStronglyTypedModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"GenerateCode\")}}</h1>\r\n </div>\r\n <div>\r\n <BBSF-TextArea [options]=\"stronglyTypedClass\" [group]=\"generateCodeForm\">\r\n </BBSF-TextArea>\r\n\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseStronglyTypedClassModal id=\"CloseStronglyTypedClassModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm\" (click)=\"copyInputMessage()\">\r\n {{utilityService.getResourceValue(\"CopyToClipboard\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n\r\n<!--delete Modal-->\r\n<BBSF-ConfirmationModal *ngIf=\"deleteControlLoaded\" [options]=\"deleteConfirmationOptions\" id=\"ConfirmationModalControl\"\r\n#ConfirmationModalControl></BBSF-ConfirmationModal>\r\n\r\n<!--Export Modal-->\r\n<BBSF-ConfirmationModal *ngIf=\"exportControlLoaded\" [options]=\"exportConfirmationOptions\" id=\"exportConfirmationControl\"\r\n#exportConfirmationControl></BBSF-ConfirmationModal>\r\n\r\n<!--Reload Modal-->\r\n<BBSF-ConfirmationModal *ngIf=\"reloadControlLoaded\" [options]=\"reloadConfirmationOptions\" id=\"ReloadConfirmationModalControl\"\r\n#ReloadConfirmationModalControl></BBSF-ConfirmationModal>\r\n\r\n<!--Rest Modal-->\r\n<BBSF-ConfirmationModal *ngIf=\"restToFactoryDefaultControlLoaded\" [options]=\"restToFactoryDefaultConfirmationOptions\" id=\"RestConfirmationModalControl\"\r\n#RestConfirmationModalControl></BBSF-ConfirmationModal>\r\n\r\n\r\n <!-- Resource Validation Modal-->\r\n <ng-template #ResourceValidationModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"ResourcecheckResult\")}}</h1>\r\n </div>\r\n <div class=\"notice d-flex bg-light-warning rounded border-warning border border-dashed mb-10 p-6\">\r\n <!--begin::Icon-->\r\n <!--begin::Svg Icon | path: icons/duotune/general/gen044.svg-->\r\n <span class=\"svg-icon svg-icon-2tx svg-icon-warning me-4\">\r\n <span [inlineSVG]=\"'./src/assets/images/gen044.svg'\"></span>\r\n </span>\r\n <!--end::Svg Icon-->\r\n <!--end::Icon-->\r\n <!--begin::Wrapper-->\r\n <div class=\"d-flex flex-stack flex-grow-1\">\r\n <!--begin::Content-->\r\n <div class=\"fw-bold\">\r\n <div class=\"fs-6 text-gray-700\" *ngIf=\"!excelValidation.isValid\">\r\n <div>\r\n {{utilityService.getResourceValue(\"UpdatedEntriesNumber\")}} {{excelValidation.validCount}}\r\n </div>\r\n <div>\r\n {{utilityService.getResourceValue(\"InvalidEntriesNumber\")}} {{excelValidation.invalidCount}}\r\n </div>\r\n </div>\r\n <div class=\"fs-6 text-gray-700\" *ngIf=\"excelValidation.isValid\">\r\n {{utilityService.getResourceValue(\"AllEntriesValid\")}}\r\n </div>\r\n\r\n </div>\r\n <!--end::Content-->\r\n </div>\r\n <!--end::Wrapper-->\r\n </div>\r\n <div *ngIf=\"!excelValidation.isValid\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ResourceId\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ResourceSet\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ErrorMessage\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"fw-bold text-gray-600 border-0\">\r\n <tr class=\"trItem\" *ngFor=\"let Localization of excelValidation.invalidEntries\">\r\n <td class=\"text-dark\">\r\n {{Localization.resourceId}}\r\n </td>\r\n <td>{{Localization.resourceSet}}</td>\r\n <td>{{Localization.errorMessage}}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseResourceValidationModal id=\"CloseResourceValidationModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"button\" (click)=\"confirmExcel()\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n", styles: [".info{background-color:#e7f3fe;border-left:6px solid #2196F3}\n"], components: [{ type: i7.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i8.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i9.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i10.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i8.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i8.ɵv, selector: "BBSF-Form", inputs: ["options"] }, { type: i8.ɵq, selector: "BBSF-AutocompleteTextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵf, selector: "BBSF-MultiLingualTextArea", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵb, selector: "BBSF-FileUplaod", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵe, selector: "BBSF-TextArea", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.ɵw, selector: "BBSF-ConfirmationModal", inputs: ["options"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgbDropdown, selector: "[ngbDropdown]", inputs: ["open", "placement", "container", "autoClose", "display", "dropdownClass"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i6.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i6.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i9.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i6.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.InlineSVGDirective, selector: "[inlineSVG]", inputs: ["resolveSVGUrl", "replaceContents", "prepend", "injectComponent", "cacheSVG", "forceEvalStyles", "evalScripts", "inlineSVG", "setSVGAttributes", "removeSVGAttributes", "fallbackImgUrl", "onSVGLoaded"], outputs: ["onSVGInserted", "onSVGFailed"] }] });
|
|
422
466
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: LocalizationsComponent, decorators: [{
|
|
423
467
|
type: Component,
|
|
424
468
|
args: [{
|
|
@@ -426,27 +470,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImpo
|
|
|
426
470
|
templateUrl: './localizations.component.html',
|
|
427
471
|
styleUrls: ['./localizations.component.css']
|
|
428
472
|
}]
|
|
429
|
-
}], ctorParameters: function () { return [{ type: i1.
|
|
430
|
-
type: ViewChild,
|
|
431
|
-
args: ['CloseResourceModal', { static: false }]
|
|
432
|
-
}], CloseEditResourceModal: [{
|
|
433
|
-
type: ViewChild,
|
|
434
|
-
args: ['CloseEditResourceModal', { static: false }]
|
|
435
|
-
}], EditResourceModal: [{
|
|
436
|
-
type: ViewChild,
|
|
437
|
-
args: ['EditResourceModal', { static: false }]
|
|
438
|
-
}], input: [{
|
|
473
|
+
}], ctorParameters: function () { return [{ type: i1.PageInfoService }, { type: i2.UtilityService }, { type: i2.EnvironmentService }, { type: i3.DatePipe }, { type: i4.ClipboardService }, { type: i5.localizationsService }, { type: i6.NgbModal }, { type: i2.RequestHandlerService }]; }, propDecorators: { pagingElement: [{
|
|
439
474
|
type: ViewChild,
|
|
440
475
|
args: ['LocalizationPagingViewElement', { static: false }]
|
|
441
|
-
}],
|
|
476
|
+
}], ConfirmationModalControl: [{
|
|
477
|
+
type: ViewChild,
|
|
478
|
+
args: ['ConfirmationModalControl', { static: false }]
|
|
479
|
+
}], exportConfirmationControl: [{
|
|
442
480
|
type: ViewChild,
|
|
443
|
-
args: ['
|
|
444
|
-
}],
|
|
481
|
+
args: ['exportConfirmationControl', { static: false }]
|
|
482
|
+
}], reloadConfirmationModalControl: [{
|
|
445
483
|
type: ViewChild,
|
|
446
|
-
args: ['
|
|
447
|
-
}],
|
|
484
|
+
args: ['ReloadConfirmationModalControl', { static: false }]
|
|
485
|
+
}], restConfirmationModalControl: [{
|
|
448
486
|
type: ViewChild,
|
|
449
|
-
args: ['
|
|
487
|
+
args: ['RestConfirmationModalControl', { static: false }]
|
|
450
488
|
}], ShowResourceValidationModal: [{
|
|
451
489
|
type: ViewChild,
|
|
452
490
|
args: ['ShowResourceValidationModal', { static: false }]
|
|
@@ -454,4 +492,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImpo
|
|
|
454
492
|
type: ViewChild,
|
|
455
493
|
args: ['CloseResourceValidationModal', { static: false }]
|
|
456
494
|
}] } });
|
|
457
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2xvY2FsaXphdGlvbnMvbG9jYWxpemF0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2xvY2FsaXphdGlvbnMvbG9jYWxpemF0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsMkJBQTJCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5TyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUUxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBR2xGLE9BQU8sRUFBRSxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBT25DLE1BQU0sT0FBTyxzQkFBc0I7SUFvRWpDLFlBQW9CLFdBQXVCLEVBQVMsZUFBK0IsRUFBUyxjQUE2QixFQUFTLG9CQUF5QyxFQUFTLGtCQUFxQyxFQUFVLFFBQWtCLEVBQVUsaUJBQW1D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QUFFLEtBQUssRUFBRTtnQkFXSCx3QkFBd0I7c0JBQWpGLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUlFLHdCQUF3QjtzQkFBakYsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0Esc0JBQXNCO3NCQUE3RSxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFNTywyQkFBMkI7c0JBQXZGLFNBQVM7dUJBQUMsNkJBQTZCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNHLDRCQUE0QjtzQkFBekYsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlT3B0aW9ucywgRHJvcGRvd25PcHRpb25zLCBGaWxlVXBsb2FkT3B0aW9ucywgRmlsZVR5cGUsIEZpbHRlckl0ZW0sIEZpbHRlclR5cGUsIElucHV0VHlwZSwgUGFnaW5nT3B0aW9ucywgVGV4dEFyZWFPcHRpb25zLCBUZXh0Qm94T3B0aW9ucywgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zLCBFbmdsaXNoQXJhYmljRFRPIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMnO1xyXG5pbXBvcnQgeyBFZGl0UmVzb3VyY2VNb2RlbCB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvTG9jYWxpemF0aW9uTW9kZWxzL0VkaXRSZXNvdXJjZU1vZGVsJztcclxuaW1wb3J0IHsgbG9jYWxpemF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvU2VydmljZXMvbG9jYWxpemF0aW9uc1NlcnZpY2Uuc2VydmljZSAnO1xyXG5pbXBvcnQgeyBVcGxvYWRKc29uVk0gfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL0xvY2FsaXphdGlvbk1vZGVscy9VcGxvYWRKc29uVk0nO1xyXG5pbXBvcnQgeyBDbGlwYm9hcmRTZXJ2aWNlIH0gZnJvbSAnbmd4LWNsaXBib2FyZCc7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX21ldHJvbmljL2NvcmUvc2VydmljZXMvcGFnZS1pbmZvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlLCBCQlNGVHJhbnNsYXRlU2VydmljZSwgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgc2F2ZUFzfSBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWxvY2FsaXphdGlvbnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9sb2NhbGl6YXRpb25zLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9sb2NhbGl6YXRpb25zLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9jYWxpemF0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEFwaVVybCA9IFwiL2FwaS9hZG1pbi9Mb2NhbGl6YXRpb25zL1wiXHJcbiAgUmVzb3VyY2VTZXRPcHRpb25zOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgc2VhcmNoVGV4dEJveDogVGV4dEJveE9wdGlvbnM7XHJcbiAgU2VsZWN0ZWRMb2NhbGl6YXRpb25MaXN0ID0gW107XHJcbiAgUmVzb3VyY2VTZXRMaXN0ID0gW107XHJcbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIExvY2FsaXphdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBzaG93RmlsdGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTG9jYWxpemF0aW9uUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIExvY2FsaXphdGlvblBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICBSZXNvdXJjZVNldEZpbHRlcjogRmlsdGVySXRlbTtcclxuICBUZXh0SW5wdXRGaWx0ZXI6IEZpbHRlckl0ZW07XHJcbiAgSXNGaWx0ZXJMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQcm9kdWN0aW9uTW9kZTogYm9vbGVhbjtcclxuXHJcbiAgLy9BZGQgTW9kZWwgQ29udHJvbHNcclxuICBBZGRSZXNvdXJjZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBSZXNvdXJjZVNldDogQXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICBSZXNvdXJjZUlkOiBUZXh0Qm94T3B0aW9ucztcclxuICBNdWx0aUxpbmd1YWxWYWx1ZTpNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnNcclxuICBNdWx0aUxpbmd1YWxDb21tZW50Ok11bHRpTGluZ3VhbFRleHRBcmVhT3B0aW9uc1xyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlUmVzb3VyY2VNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZVJlc291cmNlTW9kYWw6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICAvL0VkaXQgTW9kZWwgQ29udHJvbHNcclxuICBFZGl0UmVzb3VyY2VGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgRWRpdE11bHRpTGluZ3VhbFZhbHVlOk11bHRpTGluZ3VhbFRleHRBcmVhT3B0aW9uc1xyXG4gIEVkaXRNdWx0aUxpbmd1YWxDb21tZW50Ok11bHRpTGluZ3VhbFRleHRBcmVhT3B0aW9uc1xyXG4gIHJlc291cmNlSWQ6IHN0cmluZztcclxuICByZXNvdXJjZVNldDogc3RyaW5nO1xyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlRWRpdFJlc291cmNlTW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ2xvc2VFZGl0UmVzb3VyY2VNb2RhbDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdFZGl0UmVzb3VyY2VNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBFZGl0UmVzb3VyY2VNb2RhbDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdMb2NhbGl6YXRpb25QYWdpbmdWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBpbnB1dDogRWxlbWVudFJlZjtcclxuICAvL0dlbmVyYXRlU3Ryb25nbHlUeXBlZENsYXNzXHJcbiAgU3Ryb25nbHlUeXBlZENsYXNzOiBUZXh0QXJlYU9wdGlvbnM7XHJcbiAgVmFsdWVUb0NvcHk6IHN0cmluZyA9IFwiXCI7XHJcbiAgR2VuZXJhdGVDb2RlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAvL1VwbG9hZCBNb2RlbCBDb250cm9sc1xyXG4gIFVwbG9hZEpzb25GaWxlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIFVwbG9hZFJlc291cmNlU2V0T3B0aW9uczogRHJvcGRvd25PcHRpb25zO1xyXG4gIFJlc291cmNlc0ZpbGVJbnB1dDogRmlsZVVwbG9hZE9wdGlvbnM7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlVXBsb2FkSnNvbkZpbGVNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZVVwbG9hZEpzb25GaWxlTW9kYWw6IEVsZW1lbnRSZWY7XHJcblxyXG4gIC8vZGVsZXRlICBNb2RlbCBDb250cm9sc1xyXG4gIGRlbGV0ZVJlc291cmNlTGlzdDogYW55W10gPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlRGVsZXRlUmVzb3VyY2VNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZURlbGV0ZVJlc291cmNlTW9kYWw6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICAvL0NvbmZpcm1hdGlvbiAgTW9kZWwgQ29udHJvbHNcclxuICBDb25maXJtYXRpb25Nb2RhbFR5cGU6IG51bWJlciA9IDA7XHJcbiAgQ29uZmlybWF0aW9uTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuICBIZWFkZXJNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlQ29uZmlybWF0aW9uTW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ2xvc2VDb25maXJtYXRpb25Nb2RhbDogRWxlbWVudFJlZjtcclxuXHJcblxyXG4gIFxyXG4gIC8vUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWxDb250cm9sc1xyXG4gIEV4Y2VsVmFsaWRhdGlvbjphbnk7XHJcbiAgQFZpZXdDaGlsZCgnU2hvd1Jlc291cmNlVmFsaWRhdGlvbk1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIFNob3dSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdDbG9zZVJlc291cmNlVmFsaWRhdGlvbk1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIENsb3NlUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWw6IEVsZW1lbnRSZWY7XHJcbiAgbGFuZ3VhZ2U6c3RyaW5nPVwiXCI7XHJcblxyXG4gXHJcbiAgU2hvd1BhZ2VDb250ZW50OmJvb2xlYW49ZmFsc2U7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoU2VydmljZTpBdXRoU2VydmljZSxwcml2YXRlIHBhZ2VJbmZvU2VydmljZTpQYWdlSW5mb1NlcnZpY2UsIHB1YmxpYyB1dGlsaXR5U2VydmljZTpVdGlsaXR5U2VydmljZSxwcml2YXRlIGJic2ZUcmFuc2xhdGVTZXJ2aWNlOkJCU0ZUcmFuc2xhdGVTZXJ2aWNlLHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOkVudmlyb25tZW50U2VydmljZSwgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsIHByaXZhdGUgX2NsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2UscHJpdmF0ZSBsb2NhbGl6YXRpb25zU2VydmljZTogbG9jYWxpemF0aW9uc1NlcnZpY2UsIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCkge1xyXG4gIH1cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuU2hvd1BhZ2VDb250ZW50PXRydWU7XHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZVRpdGxlPXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkxvY2FsaXphdGlvblwiKVxyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VCcmVhZGNydW1icz1bXHJcbiAgICAgICB7dGl0bGU6IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkhvbWVcIikgLCBwYXRoOiAnL0FkbWluL0hvbWUnLCBpc1NlcGFyYXRvcjogZmFsc2UsIGlzQWN0aXZlOiBmYWxzZX0sXHJcbiAgICAgICB7dGl0bGU6ICcnLCBwYXRoOiAnJywgaXNTZXBhcmF0b3I6IHRydWUsIGlzQWN0aXZlOiBmYWxzZX1cclxuXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLmJic2ZUcmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KT0+e1xyXG4gICAgICB0aGlzLmxhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgfSlcclxuICAgIHRoaXMubGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xyXG4gICAgdGhpcy5Qcm9kdWN0aW9uTW9kZSA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldFByb2R1Y3Rpb25Nb2RlKClcclxuICAgIHRoaXMuTG9hZERyb3Bkb3duTGlzdHMoKTtcclxuICB9XHJcblxyXG4gXHJcblxyXG4gIFJlaW5pdGlhbGl6ZUxvY2FsaXphdGlvblBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gIH1cclxuXHJcbiAgVXBkYXRlTG9jYWxpemF0aW9uUGFnaW5nKCkge1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG5cclxuICBzZXRMb2NhbGl6YXRpb25MaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5Mb2NhbGl6YXRpb25QYWdpbmdSZXN1bHQgPSByZXN1bHRcclxuICAgIHRoaXMuU2hvd1BhZ2VDb250ZW50PXRydWU7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc2VsZWN0QWxsTG9jYWxpemF0aW9uTGlzdChldmVudCwgTG9jYWxpemF0aW9ucykge1xyXG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBMb2NhbGl6YXRpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IExvY2FsaXphdGlvbiA9IExvY2FsaXphdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIkxvY2FsaXphdGlvbi1cIiArIExvY2FsaXphdGlvbi5SZXNvdXJjZUlkKTtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIpO1xyXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRMb2NhbGl6YXRpb25MaXN0LnB1c2goTG9jYWxpemF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFldmVudC50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTG9jYWxpemF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBMb2NhbGl6YXRpb24gPSBMb2NhbGl6YXRpb25zW2luZGV4XTtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJMb2NhbGl6YXRpb24tXCIgKyBMb2NhbGl6YXRpb24uUmVzb3VyY2VJZCk7XHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJjaGVja2VkXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuU2VsZWN0ZWRMb2NhbGl6YXRpb25MaXN0ID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2FkRmlsdGVycygpIHtcclxuICAgIGlmICh0aGlzLnNob3dGaWx0ZXIgPT09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0ZpbHRlciA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXIgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBMb2FkRHJvcGRvd25MaXN0cygpIHtcclxuXHJcbiAgICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLkxvYWRkcm9wZG93bnMoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLlJlc291cmNlU2V0TGlzdCA9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgLy8gUmVzb3VyY2UgU2V0IEluaXQgICBcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldE9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuUmVzb3VyY2VTZXRPcHRpb25zLk5hbWUgPSBcIlJlc291cmNlU2V0XCJcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldE9wdGlvbnMuTGFiZWxLZXkgPSBcIlJlc291cmNlU2V0XCJcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldE9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMuUmVzb3VyY2VTZXRMaXN0XHJcbiAgICAgIHRoaXMuUmVzb3VyY2VTZXRPcHRpb25zLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuUmVzb3VyY2VTZXRPcHRpb25zLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldE9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gVGV4dEJveCBpbnRpXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5IaWRlTGFiZWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guVHlwZSA9IElucHV0VHlwZS5UZXh0XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZU9yUmVzb3VyY2VJRFwiKVxyXG4gICAgICBcclxuXHJcblxyXG4gICAgICB0aGlzLlJlc291cmNlU2V0RmlsdGVyID0gbmV3IEZpbHRlckl0ZW0oKTtcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldEZpbHRlci5Gb3JtQ29udHJvbE5hbWUgPSBcIlJlc291cmNlU2V0XCJcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJyZXNvdXJjZVNldFwiXHJcbiAgICAgIHRoaXMuUmVzb3VyY2VTZXRGaWx0ZXIuSXNGb3JtQ29udHJvbCA9IHRydWVcclxuICAgICAgdGhpcy5SZXNvdXJjZVNldEZpbHRlci5GaWx0ZXJUeXBlID0gRmlsdGVyVHlwZS5Ecm9wZG93bkxpc3RcclxuXHJcblxyXG4gICAgICB0aGlzLlRleHRJbnB1dEZpbHRlciA9IG5ldyBGaWx0ZXJJdGVtKCk7XHJcbiAgICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLkZvcm1Db250cm9sTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLkFjdGlvblBhcmFtZXRlck5hbWUgPSBcInJlc291cmNlTmFtZVwiXHJcbiAgICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLklzRm9ybUNvbnRyb2wgPSB0cnVlXHJcbiAgICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLkZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlLlRleHRCb3hcclxuXHJcblxyXG4gICAgICB0aGlzLkxvY2FsaXphdGlvblBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuTG9jYWxpemF0aW9uUGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgJ0dldExvY2FsaXphdGlvbnNCeUZpbHRlcic7XHJcbiAgICAgIHRoaXMuTG9jYWxpemF0aW9uUGFnaW5nLk9uS2V5UHJlc3NGaWx0ZXJzQ29udHJvbE5hbWVzID0gW1wic2VhcmNoVGV4dEJveFwiXVxyXG4gICAgICB0aGlzLkxvY2FsaXphdGlvblBhZ2luZy5Ecm9wZG93bkZpbHRlcnNDb250cm9sTmFtZXMgPSBbXCJSZXNvdXJjZVNldFwiXTtcclxuICAgICAgdGhpcy5Mb2NhbGl6YXRpb25QYWdpbmcuRmlsdGVycyA9IFt0aGlzLlJlc291cmNlU2V0RmlsdGVyLCB0aGlzLlRleHRJbnB1dEZpbHRlcl1cclxuICAgICAgdGhpcy5Mb2NhbGl6YXRpb25QYWdpbmcuVmFsaWRhdGlvblRva2VuID0gdGhpcy5hdXRoU2VydmljZS5hdXRob3JpemF0aW9uSGVhZGVyVmFsdWUoKVxyXG4gICAgICB0aGlzLklzRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICByZXNldEZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLkxvY2FsaXphdGlvbkZvcm0uY29udHJvbHNbXCJSZXNvdXJjZVNldFwiXS5zZXRWYWx1ZShbXSk7XHJcbiAgICB0aGlzLkxvY2FsaXphdGlvbkZvcm0uY29udHJvbHNbXCJzZWFyY2hUZXh0Qm94XCJdLnNldFZhbHVlKG51bGwpO1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZXhwb3J0RXhjZWwoRXhwb3J0QXNUZW1wbGF0ZTpib29sZWFuPWZhbHNlKSB7XHJcbiAgICBsZXQgVXNlcnNGb3JtRmlsdGVycyA9IHRoaXMuTG9jYWxpemF0aW9uRm9ybS52YWx1ZVxyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKFwicmVzb3VyY2VTZXRcIiwgdGhpcy5Mb2NhbGl6YXRpb25Gb3JtLmNvbnRyb2xzW1wiUmVzb3VyY2VTZXRcIl0udmFsdWUgPT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMuTG9jYWxpemF0aW9uRm9ybS5jb250cm9sc1tcIlJlc291cmNlU2V0XCJdLnZhbHVlKTtcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoXCJyZXNvdXJjZU5hbWVcIiwgdGhpcy5Mb2NhbGl6YXRpb25Gb3JtLmNvbnRyb2xzW1wic2VhcmNoVGV4dEJveFwiXS52YWx1ZSA9PSB1bmRlZmluZWQgPyBcIlwiIDogdGhpcy5Mb2NhbGl6YXRpb25Gb3JtLmNvbnRyb2xzW1wic2VhcmNoVGV4dEJveFwiXS52YWx1ZSk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKFwiZXhwb3J0QXNUZW1wbGF0ZVwiLEV4cG9ydEFzVGVtcGxhdGUudG9TdHJpbmcoKSk7XHJcblxyXG4gICAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5FeHBvcnQocGFyYW1zKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgRmlsZURUTyA9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtGaWxlRFRPXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xyXG4gICAgICBcclxuICAgICAgc2F2ZUFzKGZpbGUsIGBMb2NhbGl6YXRpb25zJHt0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShuZXcgRGF0ZSgpLFwiZGQtTU0tWVlZWSBoaDptbVwiKS50b1N0cmluZygpfS54bHN4YCk7XHJcbiAgICAgIFxyXG4gICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIFxyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgc2hvd0FkZFJlc291cmNlTW9kYWwoYWRkUmVzb3VyY2VNb2RhbCkge1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUkoKTtcclxuICAgIHRoaXMuQWRkUmVzb3VyY2VGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG5cclxuICAgIHRoaXMuUmVzb3VyY2VTZXQgPSBuZXcgQXV0b2NvbXBsZXRlT3B0aW9ucygpO1xyXG4gICAgdGhpcy5SZXNvdXJjZVNldC5OYW1lID0gXCJSZXNvdXJjZVNldFwiO1xyXG4gICAgdGhpcy5SZXNvdXJjZVNldC5MYWJlbEtleSA9IFwiUmVzb3VyY2VTZXRcIjtcclxuICAgIHRoaXMuUmVzb3VyY2VTZXQuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgdGhpcy5SZXNvdXJjZVNldC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIHRoaXMuUmVzb3VyY2VTZXQuVmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy5SZXNvdXJjZVNldC5BY3Rpb25VUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgXCJBdXRvQ29tcGxldGVSZXNvdXJjZVNldFwiXHJcbiAgICB0aGlzLlJlc291cmNlU2V0LlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuICAgXHJcbiAgICB0aGlzLlJlc291cmNlSWQgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgIHRoaXMuUmVzb3VyY2VJZC5OYW1lID0gXCJSZXNvdXJjZUlkXCI7XHJcbiAgICB0aGlzLlJlc291cmNlSWQuTGFiZWxLZXkgPSBcIlJlc291cmNlSWRcIjtcclxuICAgIHRoaXMuUmVzb3VyY2VJZC5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICB0aGlzLlJlc291cmNlSWQuVmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy5SZXNvdXJjZUlkLklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuTXVsdGlMaW5ndWFsVmFsdWUgPSBuZXcgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zKCk7XHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbFZhbHVlLk5hbWUgPSBcIlZhbHVlXCI7XHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbFZhbHVlLkFyYWJpY0xhYmVsS2V5ID0gIFwiVmFsdWVJbkFyYWJpY1wiO1xyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxWYWx1ZS5FbmdsaXNoTGFiZWxLZXkgPSBcIlZhbHVlSW5FbmdsaXNoXCI7XHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbFZhbHVlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIFxyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxDb21tZW50ID0gbmV3IE11bHRpTGluZ3VhbFRleHRBcmVhT3B0aW9ucygpO1xyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxDb21tZW50Lk5hbWUgPSBcIkNvbW1lbnRcIjtcclxuICAgIHRoaXMuTXVsdGlMaW5ndWFsQ29tbWVudC5BcmFiaWNMYWJlbEtleSA9ICBcIkNvbW1lbnRJbkFyYWJpY1wiO1xyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxDb21tZW50LkVuZ2xpc2hMYWJlbEtleSA9IFwiQ29tbWVudEluRW5nbGlzaFwiO1xyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxDb21tZW50LklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGFkZFJlc291cmNlTW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkUmVzb3VyY2UoKSB7XHJcbiAgICBpZiAodGhpcy5BZGRSZXNvdXJjZUZvcm0uaW52YWxpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICBcclxuICAgICAgbGV0IFJlc3VsdE1vZGVsID0gdGhpcy5BZGRSZXNvdXJjZUZvcm0udmFsdWU7XHJcbiAgICAgICBjb25zb2xlLmxvZyhSZXN1bHRNb2RlbClcclxuICAgICAgbGV0IFJlc291cmNlTW9kZWwgPSBuZXcgRWRpdFJlc291cmNlTW9kZWwoKTtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5SZXNvdXJjZUlkID0gUmVzdWx0TW9kZWwuUmVzb3VyY2VJZDtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5SZXNvdXJjZVNldCA9IFJlc3VsdE1vZGVsLlJlc291cmNlU2V0LnZhbHVlO1xyXG4gICAgICBSZXNvdXJjZU1vZGVsLlZhbHVlRU4gPSBSZXN1bHRNb2RlbC5WYWx1ZS5FbmdsaXNoVGV4dEFyZWFWYWx1ZTtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5WYWx1ZUFSID0gUmVzdWx0TW9kZWwuVmFsdWUuQXJhYmljVGV4dEFyZWFWYWx1ZTtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5Db21tZW50QXIgPSBSZXN1bHRNb2RlbC5Db21tZW50LkFyYWJpY1RleHRBcmVhVmFsdWU7XHJcbiAgICAgIFJlc291cmNlTW9kZWwuQ29tbWVudEVuID0gUmVzdWx0TW9kZWwuQ29tbWVudC5FbmdsaXNoVGV4dEFyZWFWYWx1ZTtcclxuXHJcbiAgICAgIHRoaXMubG9jYWxpemF0aW9uc1NlcnZpY2UuQWRkUmVzb3VyY2UoUmVzb3VyY2VNb2RlbCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgICAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICBcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzaG93RWRpdFJlc291cmNlTW9kYWwoUmVzb3VyY2U6IGFueSwgRWRpdFJlc291cmNlTW9kYWwpIHtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJKCk7XHJcbiAgICB0aGlzLkVkaXRSZXNvdXJjZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgICB0aGlzLnJlc291cmNlSWQgPSBSZXNvdXJjZS5yZXNvdXJjZUlkXHJcbiAgICB0aGlzLnJlc291cmNlU2V0ID0gUmVzb3VyY2UucmVzb3VyY2VTZXRcclxuXHJcblxyXG4gICAgbGV0IFZhbHVlPW5ldyBFbmdsaXNoQXJhYmljRFRPKCk7XHJcbiAgICBWYWx1ZS5BcmFiaWM9UmVzb3VyY2UudmFsdWVBUjtcclxuICAgIFZhbHVlLkVuZ2xpc2g9UmVzb3VyY2UudmFsdWVFTjtcclxuXHJcbiAgICB0aGlzLkVkaXRNdWx0aUxpbmd1YWxWYWx1ZSA9IG5ldyBNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnMoKTtcclxuICAgIHRoaXMuRWRpdE11bHRpTGluZ3VhbFZhbHVlLk5hbWUgPSBcIlZhbHVlXCI7XHJcbiAgICB0aGlzLkVkaXRNdWx0aUxpbmd1YWxWYWx1ZS5BcmFiaWNMYWJlbEtleSA9ICBcIlZhbHVlSW5BcmFiaWNcIjtcclxuICAgIHRoaXMuRWRpdE11bHRpTGluZ3VhbFZhbHVlLkVuZ2xpc2hMYWJlbEtleSA9IFwiVmFsdWVJbkVuZ2xpc2hcIjtcclxuICAgIHRoaXMuRWRpdE11bHRpTGluZ3VhbFZhbHVlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsVmFsdWUuVmFsdWUgPSBWYWx1ZTtcclxuXHJcblxyXG4gICAgbGV0IENvbW1lbnQ9bmV3IEVuZ2xpc2hBcmFiaWNEVE8oKTtcclxuICAgIENvbW1lbnQuQXJhYmljPVJlc291cmNlLmNvbW1lbnRBcjtcclxuICAgIENvbW1lbnQuRW5nbGlzaD1SZXNvdXJjZS5jb21tZW50RW47XHJcblxyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsQ29tbWVudCA9IG5ldyBNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnMoKTtcclxuICAgIHRoaXMuRWRpdE11bHRpTGluZ3VhbENvbW1lbnQuTmFtZSA9IFwiQ29tbWVudFwiO1xyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsQ29tbWVudC5BcmFiaWNMYWJlbEtleSA9ICBcIkNvbW1lbnRJbkFyYWJpY1wiO1xyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsQ29tbWVudC5FbmdsaXNoTGFiZWxLZXkgPSBcIkNvbW1lbnRJbkVuZ2xpc2hcIjtcclxuICAgIHRoaXMuRWRpdE11bHRpTGluZ3VhbENvbW1lbnQuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICB0aGlzLkVkaXRNdWx0aUxpbmd1YWxDb21tZW50LlZhbHVlID0gQ29tbWVudDtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRSZXNvdXJjZU1vZGFsKTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKTtcclxuXHJcbiAgfVxyXG5cclxuICBlZGl0UmVzb3VyY2UoKSB7XHJcbiAgICBpZiAodGhpcy5FZGl0UmVzb3VyY2VGb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBSZXN1bHRNb2RlbCA9IHRoaXMuRWRpdFJlc291cmNlRm9ybS52YWx1ZTtcclxuICAgICAgbGV0IFJlc291cmNlTW9kZWwgPSBuZXcgRWRpdFJlc291cmNlTW9kZWwoKTtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5SZXNvdXJjZUlkID0gdGhpcy5yZXNvdXJjZUlkO1xyXG4gICAgICBSZXNvdXJjZU1vZGVsLlJlc291cmNlU2V0ID0gdGhpcy5yZXNvdXJjZVNldDtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5WYWx1ZUVOID0gUmVzdWx0TW9kZWwuVmFsdWUuRW5nbGlzaFRleHRBcmVhVmFsdWU7XHJcbiAgICAgIFJlc291cmNlTW9kZWwuVmFsdWVBUiA9IFJlc3VsdE1vZGVsLlZhbHVlLkFyYWJpY1RleHRBcmVhVmFsdWU7XHJcbiAgICAgIFJlc291cmNlTW9kZWwuQ29tbWVudEVuID0gUmVzdWx0TW9kZWwuQ29tbWVudC5FbmdsaXNoVGV4dEFyZWFWYWx1ZTtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5Db21tZW50QXIgPSBSZXN1bHRNb2RlbC5Db21tZW50LkFyYWJpY1RleHRBcmVhVmFsdWU7XHJcblxyXG4gICAgICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLkVkaXRSZXNvdXJjZShSZXNvdXJjZU1vZGVsKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICBcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICBcclxuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgUmVzdFJlc291cmNlVG9GYWN0b3J5RGVmYXVsdChSZXNvdXJjZTphbnkpIHtcclxuICAgICAgbGV0IFJlc291cmNlTW9kZWwgPSBuZXcgRWRpdFJlc291cmNlTW9kZWwoKTtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5SZXNvdXJjZUlkID0gUmVzb3VyY2UucmVzb3VyY2VJZDtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5SZXNvdXJjZVNldCA9IFJlc291cmNlLnJlc291cmNlU2V0O1xyXG4gICAgICBSZXNvdXJjZU1vZGVsLlZhbHVlRU4gPSBcIlwiO1xyXG4gICAgICBSZXNvdXJjZU1vZGVsLlZhbHVlQVIgPVwiXCI7XHJcbiAgICAgIFJlc291cmNlTW9kZWwuQ29tbWVudEVuID0gXCJcIjtcclxuICAgICAgUmVzb3VyY2VNb2RlbC5Db21tZW50QXIgPSBcIlwiO1xyXG4gICAgICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLlJlc3RSZXNvdXJjZVRvRmFjdG9yeURlZmF1bHQoUmVzb3VyY2VNb2RlbCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgIFxyXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgICAgZWxlbWVudC5VcGRhdGVQYWdpbmcoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICB9KVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBzaG93RGVsZXRlUmVzb3VyY2VNb2RhbChSZXNvdXJjZTogYW55LCBEZWxldGVSZXNvdXJjZU1vZGFsKSB7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG4gICAgdGhpcy5kZWxldGVSZXNvdXJjZUxpc3QgPSBbXVxyXG4gICAgdGhpcy5kZWxldGVSZXNvdXJjZUxpc3QucHVzaChSZXNvdXJjZSk7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZVJlc291cmNlTW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG5cclxuICB9XHJcbiAgZGVsZXRlUmVzb3VyY2UoKSB7XHJcbiAgICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLkRlbGV0ZVJlc291cmNlKHRoaXMuZGVsZXRlUmVzb3VyY2VMaXN0KS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLmRlbGV0ZVJlc291cmNlTGlzdCA9IFtdO1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgUmVsb2FkSnNvbkZpbGUoKSB7XHJcbiAgICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLlJlbG9hZEpzb25GaWxlKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgICBlbGVtZW50LlVwZGF0ZVBhZ2luZygpO1xyXG4gICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgUmVzdFRvRmFjdG9yeURlZmF1bHQoKSB7XHJcbiAgIHRoaXMubG9jYWxpemF0aW9uc1NlcnZpY2UuUmVzdFRvRmFjdG9yeURlZmF1bHQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICBcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBSZXN0VW5tb2RpZmllZFRvRmFjdG9yeURlZmF1bHQoKSB7XHJcbiAgICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLlJlc3RVbm1vZGlmaWVkVG9GYWN0b3J5RGVmYXVsdCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICBcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjb3B5SW5wdXRNZXNzYWdlKCl7XHJcbiAgICB0aGlzLl9jbGlwYm9hcmRTZXJ2aWNlLmNvcHkodGhpcy5WYWx1ZVRvQ29weS50b1N0cmluZygpKTtcclxuICB9XHJcbiAgXHJcbiBcclxuICBHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzcyhHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRNb2RhbCkge1xyXG4gICAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5HZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzcygpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIHZhciBWYWx1ZSA9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgdGhpcy5TdHJvbmdseVR5cGVkQ2xhc3MgPSBuZXcgVGV4dEFyZWFPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuU3Ryb25nbHlUeXBlZENsYXNzLk5hbWUgPSBcIlN0cm9uZ2x5VHlwZWRDbGFzc1wiO1xyXG4gICAgICB0aGlzLlN0cm9uZ2x5VHlwZWRDbGFzcy5WYWx1ZSA9IFZhbHVlLnZhbC50b1N0cmluZygpO1xyXG4gICAgICB0aGlzLlZhbHVlVG9Db3B5PVZhbHVlLnZhbC50b1N0cmluZygpO1xyXG4gICAgICB0aGlzLlN0cm9uZ2x5VHlwZWRDbGFzcy5Jc0Rpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5TdHJvbmdseVR5cGVkQ2xhc3MuSGlkZUxhYmVsID0gdHJ1ZTtcclxuICAgICAgdGhpcy5TdHJvbmdseVR5cGVkQ2xhc3MuUm93cyA9IDIwO1xyXG4gICAgICB0aGlzLlN0cm9uZ2x5VHlwZWRDbGFzcy5Db2xzID0gMjA7XHJcbiAgICAgIHRoaXMuU3Ryb25nbHlUeXBlZENsYXNzLk1heExlbmd0aCA9IDEwMDAwMDA7XHJcblxyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEdlbmVyYXRlU3Ryb25nbHlUeXBlZE1vZGFsKTtcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBTaG93VXBsb2FkTW9kYWwoVXBsb2FkSnNvbkZpbGVNb2RhbCkge1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUkoKTtcclxuICAgIHRoaXMuVXBsb2FkSnNvbkZpbGVGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gICAgdGhpcy5VcGxvYWRSZXNvdXJjZVNldE9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICB0aGlzLlVwbG9hZFJlc291cmNlU2V0T3B0aW9ucy5OYW1lID0gXCJTZWxlY3RlZFJlc291cmNlU2V0XCJcclxuICAgIHRoaXMuVXBsb2FkUmVzb3VyY2VTZXRPcHRpb25zLkxhYmVsS2V5ID0gXCJSZXNvdXJjZVNldFwiXHJcbiAgICB0aGlzLlVwbG9hZFJlc291cmNlU2V0T3B0aW9ucy5EYXRhU291cmNlID0gdGhpcy5SZXNvdXJjZVNldExpc3RcclxuICAgIHRoaXMuVXBsb2FkUmVzb3VyY2VTZXRPcHRpb25zLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLlVwbG9hZFJlc291cmNlU2V0T3B0aW9ucy5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICB0aGlzLlVwbG9hZFJlc291cmNlU2V0T3B0aW9ucy5QbGFjZWhvbGRlciA9IFwiXCI7XHJcblxyXG5cclxuICAgIHRoaXMuUmVzb3VyY2VzRmlsZUlucHV0ID0gbmV3IEZpbGVVcGxvYWRPcHRpb25zKCk7XHJcbiAgICB0aGlzLlJlc291cmNlc0ZpbGVJbnB1dC5OYW1lID0gXCJSZXNvdXJjZXNGaWxlXCJcclxuICAgIHRoaXMuUmVzb3VyY2VzRmlsZUlucHV0LkxhYmVsS2V5ID0gXCJVcGxvYWRGaWxlXCJcclxuICAgIHRoaXMuUmVzb3VyY2VzRmlsZUlucHV0LklzTXVsdGlwbGVGaWxlID0gZmFsc2VcclxuICAgIHRoaXMuUmVzb3VyY2VzRmlsZUlucHV0LkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMgPSBbRmlsZVR5cGUuRXhjZWxdXHJcbiAgICB0aGlzLlJlc291cmNlc0ZpbGVJbnB1dC5GaWxlTWF4U2l6ZUluTUIgPSAxMDtcclxuICAgIHRoaXMuUmVzb3VyY2VzRmlsZUlucHV0LklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVXBsb2FkSnNvbkZpbGVNb2RhbCk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgVXBsb2FkRXhjZWxGaWxlcygpIHtcclxuICAgIGlmICh0aGlzLlVwbG9hZEpzb25GaWxlRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLlVwbG9hZEpzb25GaWxlRm9ybS52YWx1ZTtcclxuICAgICAgbGV0IFJlc291cmNlTW9kZWwgPSBuZXcgVXBsb2FkSnNvblZNKCk7XHJcblxyXG4gICAgICBSZXNvdXJjZU1vZGVsLlNlbGVjdGVkUmVzb3VyY2VTZXQgPSBSZXN1bHRNb2RlbC5TZWxlY3RlZFJlc291cmNlU2V0O1xyXG4gICAgICBSZXNvdXJjZU1vZGVsLlJlc291cmNlc0ZpbGUgPSB7XHJcbiAgICAgICAgRmlsZUJhc2U2NDogUmVzdWx0TW9kZWxbXCJSZXNvdXJjZXNGaWxlXCJdWzBdLkZpbGVCYXNlNjQsXHJcbiAgICAgICAgRmlsZU5hbWU6IFJlc3VsdE1vZGVsW1wiUmVzb3VyY2VzRmlsZVwiXVswXS5GaWxlTmFtZSxcclxuICAgICAgICBGaWxlU2l6ZUluTUI6IFJlc3VsdE1vZGVsW1wiUmVzb3VyY2VzRmlsZVwiXVswXS5GaWxlU2l6ZUluTUIsXHJcbiAgICAgICAgRmlsZVR5cGU6IFJlc3VsdE1vZGVsW1wiUmVzb3VyY2VzRmlsZVwiXVswXS5GaWxlVHlwZVxyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5VcGxvYWRFeGNlbEZpbGVzKCBSZXNvdXJjZU1vZGVsKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGxldCBSZXN1bHQ9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgICAgLy9jb25zb2xlLmxvZyhSZXN1bHQpXHJcbiAgICAgICAgdGhpcy5FeGNlbFZhbGlkYXRpb249UmVzdWx0LnZhbFxyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcblxyXG4gICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG4gIG9wZW5SZXNvdXJjZVZhbGlkYXRpb25Nb2RhbChSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbCkge1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbCk7XHJcbiAgfVxyXG4gIGNvbmZpcm1FeGNlbCgpe1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5ub3RpZnlTdWNjZXNzTWVzc2FnZSgpXHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgdGhpcy5Mb2FkRHJvcGRvd25MaXN0cygpO1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICB9XHJcblxyXG4gIHNob3dDb25maXJtYXRpb25Nb2RhbCh0eXBlOiBudW1iZXIsIENvbmZpcm1hdGlvbk1vZGFsKSB7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICB0aGlzLkhlYWRlck1lc3NhZ2UgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZWxvYWRSZXNvdXJjZXNcIik7O1xyXG4gICAgICAgIHRoaXMuQ29uZmlybWF0aW9uTWVzc2FnZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlbG9hZFJlc291cmNlc0NvbmZpcm1hdGlvblwiKTtcclxuICAgICAgICB0aGlzLkNvbmZpcm1hdGlvbk1vZGFsVHlwZSA9IDFcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAyOlxyXG4gICAgICAgIHRoaXMuSGVhZGVyTWVzc2FnZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc2V0VG9GYWN0b3J5RGVmYXVsdFwiKTs7XHJcbiAgICAgICAgdGhpcy5Db25maXJtYXRpb25NZXNzYWdlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVzZXR0b0ZhY3RvcnlDb25maXJtYXRpb25cIik7XHJcbiAgICAgICAgdGhpcy5Db25maXJtYXRpb25Nb2RhbFR5cGUgPTJcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKENvbmZpcm1hdGlvbk1vZGFsKTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIiwiPGJsb2NrLXVpPiA8L2Jsb2NrLXVpPlxyXG4gIDwhLS0gUGFnZSBDb250ZW50IC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJTaG93UGFnZUNvbnRlbnRcIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1jdXN0b20taFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJJc0ZpbHRlckxvYWRlZFwiPlxyXG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJMb2NhbGl6YXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwic2VhcmNoVGV4dEJveFwiIFtncm91cF09XCJMb2NhbGl6YXRpb25Gb3JtXCI+PC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxyXG4gICAgICAgICAgPCEtLSBiZWdpbjo6TWVudSAtLT5cclxuXHJcbiAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2tcIiBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiBTaG93UGFnZUNvbnRlbnQ9PXRydWU/J2Jsb2NrJzonbm9uZSd9XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25Ub2dnbGUgaHJlZj1cImphdmFzY3JpcHQ6O1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0LXByaW1hcnkgbWUtM1wiIGlkPVwiRmlsdGVyc0Ryb3Bkb3duXCIgdGl0bGU9XCJGaWx0ZXJcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1maWx0ZXIgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJGaWx0ZXJcIil9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIklzRmlsdGVyTG9hZGVkXCIgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cIkZpbHRlcnNEcm9wZG93blwiIGNsYXNzPVwiIGZpbHRlci1jb250YWluZXIgbWVudSBtZW51LXN1YiBtZW51LXN1Yi1kcm9wZG93biBtZW51LWNvbHVtbiBtZW51LXJvdW5kZWQgbWVudS1ncmF5LTgwMCBtZW51LXN0YXRlLWJnLWxpZ2h0LXByaW1hcnkgIHctMjUwcHggdy1tZC01MDBweCBmdy1ib2xkIHB5LTMgXCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJMb2NhbGl6YXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNyBweS01XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIlJlc291cmNlU2V0T3B0aW9uc1wiIFtncm91cF09XCJMb2NhbGl6YXRpb25Gb3JtXCI+PC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLWFjdGl2ZS1saWdodC1wcmltYXJ5IHB2LXJlc2V0IGJ0bi1zbVwiIGlkPVwiYXBwbHlGaWx0ZXJzQnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVzZXRcIil9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImV4cG9ydEV4Y2VsKClcIlxyXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkV4cG9ydFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0LXByaW1hcnkgYm5zaWdodHMtYnRuLWV4cG9ydCBtZS0zIFwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1kb3dubG9hZCBtZS0xXCI+PC9pPlxyXG4gICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFeHBvcnRcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bkFjdGl2YXRlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQtcHJpbWFyeSBtZS0zIFwiIChjbGljayk9XCJzaG93Q29uZmlybWF0aW9uTW9kYWwoMSxDb25maXJtYXRpb25Nb2RhbClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHQgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVsb2FkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG1lLTMgXCIgaWQ9XCJidG5BY3RpdmF0ZVwiIChjbGljayk9XCJTaG93VXBsb2FkTW9kYWwoVXBsb2FkSnNvbkZpbGVNb2RhbClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdXBsb2FkIG1lLTFcIj48L2k+XHJcbiAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlVwbG9hZFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBtZS0zXCIgKGNsaWNrKT1cInNob3dBZGRSZXNvdXJjZU1vZGFsKEFkZFJlc291cmNlTW9kYWwpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWRkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51dFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBtZS0zIGJ0bi1pY29uXCIgdGl0bGU9XCJvcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXJzXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51dD1cIm1hdE1lbnVcIiBjbGFzcz1cInB5LTNcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtZW51LWl0ZW0gcHgtM1wiIChjbGljayk9XCJzaG93Q29uZmlybWF0aW9uTW9kYWwoMixDb25maXJtYXRpb25Nb2RhbClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1saW5rIHB4LTNcIj4gIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc3RUb0ZhY3RvcnlEZWZhdWx0XCIpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW0gKm5nSWY9XCIhUHJvZHVjdGlvbk1vZGVcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtZW51LWl0ZW0gcHgtM1wiIChjbGljayk9XCJHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzcyhHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRNb2RhbClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1saW5rIHB4LTNcIj4gIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkdlbmVyYXRlU3Ryb25nbHlUeXBlZENsYXNzXCIpfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tIGVuZDo6TWVudSAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gZW5kOjpIZWFkZXIgLS0+XHJcbiAgICAgIDwhLS0gYmVnaW46OkJvZHkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktM1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICA8IS0tIGJlZ2luOjpUYWJsZSAtLT5cclxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNvdXJjZUlkXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNvdXJjZVNldFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRW5nbGlzaFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQXJhYmljXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGlvblwiKX19PC90aD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IExvY2FsaXphdGlvbiBvZiBMb2NhbGl6YXRpb25QYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZGFya1wiPnt7TG9jYWxpemF0aW9uLnJlc291cmNlSWR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3tMb2NhbGl6YXRpb24ucmVzb3VyY2VTZXR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3tMb2NhbGl6YXRpb24udmFsdWVFTn19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57e0xvY2FsaXphdGlvbi52YWx1ZUFSfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tbGlnaHQgYnRuLWFjdGl2ZS1saWdodC1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLWhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwibWVudS1pdGVtIHB4LTNcIiAoY2xpY2spPVwic2hvd0VkaXRSZXNvdXJjZU1vZGFsKExvY2FsaXphdGlvbixFZGl0UmVzb3VyY2VNb2RhbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpbmsgcHgtM1wiPiAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRWRpdFwiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtICpuZ0lmPVwiIVByb2R1Y3Rpb25Nb2RlXCIgY2xhc3M9XCJtZW51LWl0ZW0gcHgtM1wiIChjbGljayk9XCJzaG93RGVsZXRlUmVzb3VyY2VNb2RhbChMb2NhbGl6YXRpb24sZGVsZXRlUmVzb3VyY2VNb2RhbClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpbmsgcHgtM1wiPiAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRGVsZXRlXCIpfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJMb2NhbGl6YXRpb25QYWdpbmdSZXN1bHQubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICA8IS0tZW5kOjp1c2VycyBsaXN0LS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTBcIj5cclxuICAgICAgICA8QkJTRi1QYWdpbmcgKEl0ZW1zKT1cInNldExvY2FsaXphdGlvbkxpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiSXNGaWx0ZXJMb2FkZWRcIiBbb3B0aW9uc109XCJMb2NhbGl6YXRpb25QYWdpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiTG9jYWxpemF0aW9uRm9ybVwiICNMb2NhbGl6YXRpb25QYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuXHJcblxyXG4gIDwhLS0gQWRkIE1vZGFsIC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjQWRkUmVzb3VyY2VNb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFJlc291cmNlXCIpfX08L2gxPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJBZGRSZXNvdXJjZUZvcm1cIiAobmdTdWJtaXQpPVwiYWRkUmVzb3VyY2UoKVwiPlxyXG4gICAgICAgIDxCQlNGLUF1dG9jb21wbGV0ZVRleHRCb3ggW29wdGlvbnNdPVwiUmVzb3VyY2VTZXRcIiBbZ3JvdXBdPVwiQWRkUmVzb3VyY2VGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLUF1dG9jb21wbGV0ZVRleHRCb3g+XHJcbiAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJSZXNvdXJjZUlkXCIgW2dyb3VwXT1cIkFkZFJlc291cmNlRm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgIDxCQlNGLU11bHRpTGluZ3VhbFRleHRBcmVhIFtvcHRpb25zXT1cIk11bHRpTGluZ3VhbFZhbHVlXCIgW2dyb3VwXT1cIkFkZFJlc291cmNlRm9ybVwiPjwvQkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYT5cclxuICAgICAgICA8QkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYSBbb3B0aW9uc109XCJNdWx0aUxpbmd1YWxDb21tZW50XCIgW2dyb3VwXT1cIkFkZFJlc291cmNlRm9ybVwiPjwvQkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlUmVzb3VyY2VNb2RhbCBpZD1cIkNsb3NlUmVzb3VyY2VNb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBFZGl0IE1vZGFsIC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjRWRpdFJlc291cmNlTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0UmVzb3VyY2VcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIkVkaXRSZXNvdXJjZUZvcm1cIiAobmdTdWJtaXQpPVwiZWRpdFJlc291cmNlKClcIj5cclxuICAgICAgICA8QkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYSBbb3B0aW9uc109XCJFZGl0TXVsdGlMaW5ndWFsVmFsdWVcIiBbZ3JvdXBdPVwiRWRpdFJlc291cmNlRm9ybVwiPjwvQkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYT5cclxuICAgICAgICA8QkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYSBbb3B0aW9uc109XCJFZGl0TXVsdGlMaW5ndWFsQ29tbWVudFwiIFtncm91cF09XCJFZGl0UmVzb3VyY2VGb3JtXCI+PC9CQlNGLU11bHRpTGluZ3VhbFRleHRBcmVhPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlRWRpdFJlc291cmNlTW9kYWwgaWQ9XCJDbG9zZUVkaXRSZXNvdXJjZU1vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNhdmVMYWJlbFwiKX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8IS0tIFVwbG9hZCBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI1VwbG9hZEpzb25GaWxlTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJVcGxvYWRSZXNvdXJjZXNcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWNlIGQtZmxleCBiZy1saWdodC1wcmltYXJ5IHJvdW5kZWQgYm9yZGVyLXByaW1hcnkgYm9yZGVyIGJvcmRlci1kYXNoZWQgbWItMTAgcC02XCI+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpJY29uLS0+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpTdmcgSWNvbiB8IHBhdGg6IGljb25zL2R1b3R1bmUvZ2VuZXJhbC9nZW4wNDQuc3ZnLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0ydHggc3ZnLWljb24tcHJpbWFyeSBtZS00XCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2dlbjA0NC5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8IS0tZW5kOjpTdmcgSWNvbi0tPlxyXG4gICAgICAgIDwhLS1lbmQ6Okljb24tLT5cclxuICAgICAgICA8IS0tYmVnaW46OldyYXBwZXItLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtc3RhY2sgZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgIDwhLS1iZWdpbjo6Q29udGVudC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgdGV4dC1ncmF5LTcwMFwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlVwbG9hZEpzb25SZXNvdXJjZXNJbmZvXCIpfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS1lbmQ6OkNvbnRlbnQtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tZW5kOjpXcmFwcGVyLS0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIlVwbG9hZEpzb25GaWxlRm9ybVwiIChuZ1N1Ym1pdCk9XCJVcGxvYWRFeGNlbEZpbGVzKClcIj5cclxuICAgICAgICA8YSBbaGlkZGVuXT1cInRydWVcIiBpZD1cIlNob3dSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbFwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwib3BlblJlc291cmNlVmFsaWRhdGlvbk1vZGFsKFJlc291cmNlVmFsaWRhdGlvbk1vZGFsKVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1oaXN0b3J5XCI+PC9pPiB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJzaG93XCIpfX1cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPEJCU0YtRmlsZVVwbGFvZCBbb3B0aW9uc109XCJSZXNvdXJjZXNGaWxlSW5wdXRcIiBbZ3JvdXBdPVwiVXBsb2FkSnNvbkZpbGVGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLUZpbGVVcGxhb2Q+XHJcbiAgICAgICAgPGEgaWQ9XCJidG5EZWFjdGl2YXRlXCIgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJleHBvcnRFeGNlbCh0cnVlKVwiPlxyXG4gICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRG93bmxvYWRSZXNvdXJjZVRlbXBsYXRlU2hlZXRcIil9fVxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlVXBsb2FkSnNvbkZpbGVNb2RhbCBpZD1cIkNsb3NlVXBsb2FkSnNvbkZpbGVNb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gIDwhLS0gRGVsZXRlICBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI2RlbGV0ZVJlc291cmNlTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVcIil9fSB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNvdXJjZVwiKX19PC9oMT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpY2UgZC1mbGV4IGJnLWxpZ2h0LWRhbmdlciByb3VuZGVkIGJvcmRlci1kYW5nZXIgYm9yZGVyIGJvcmRlci1kYXNoZWQgbWItMTAgcC02XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0ydHggc3ZnLWljb24tZGFuZ2VyIG1lLTRcIj5cclxuICAgICAgICAgIDxzcGFuIFtpbmxpbmVTVkddPVwiJy4vc3JjL2Fzc2V0cy9pbWFnZXMvZ2VuMDQ0LnN2ZydcIj48L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtc3RhY2sgZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy02IHRleHQtZ3JheS03MDBcIj5cclxuICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVfUXVlc3Rpb25cIil9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB0LTdcIj5cclxuICAgICAgICA8YnV0dG9uICNDbG9zZURlbGV0ZVJlc291cmNlTW9kYWwgaWQ9XCJDbG9zZURlbGV0ZVJlc291cmNlTW9kYWxcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gbWUtMyBcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlUmVzb3VyY2UoKVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQtZGFuZ2VyIGJ0bi1zbSBcIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZVwiKX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzcyAgTW9kYWwgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRNb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkdlbmVyYXRlQ29kZVwiKX19PC9oMT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiR2VuZXJhdGVDb2RlRm9ybVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8QkJTRi1UZXh0QXJlYSBbb3B0aW9uc109XCJTdHJvbmdseVR5cGVkQ2xhc3NcIiBbZ3JvdXBdPVwiR2VuZXJhdGVDb2RlRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLVRleHRBcmVhPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlU3Ryb25nbHlUeXBlZENsYXNzTW9kYWwgaWQ9XCJDbG9zZVN0cm9uZ2x5VHlwZWRDbGFzc01vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiIChjbGljayk9XCJjb3B5SW5wdXRNZXNzYWdlKClcIj5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ29weVRvQ2xpcGJvYXJkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcblxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiAgPCEtLSBDb25maXJtYXRpb24gTWVzc2FnZSAgTW9kYWwgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNDb25maXJtYXRpb25Nb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7SGVhZGVyTWVzc2FnZX19PC9oMT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAge3tDb25maXJtYXRpb25NZXNzYWdlfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlQ29uZmlybWF0aW9uTW9kYWwgaWQ9XCJDbG9zZUNvbmZpcm1hdGlvbk1vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cIkNvbmZpcm1hdGlvbk1vZGFsVHlwZT09MlwiIChjbGljayk9XCJSZXN0VG9GYWN0b3J5RGVmYXVsdCgpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtXCI+XHJcbiAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNldFRvRmFjdG9yeURlZmF1bHRcIil9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiQ29uZmlybWF0aW9uTW9kYWxUeXBlPT0xXCIgKGNsaWNrKT1cIlJlbG9hZEpzb25GaWxlKClcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRhbmdlciBidG4tc21cIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlbG9hZFwiKX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDwhLS0gUmVzb3VyY2UgVmFsaWRhdGlvbiBNb2RhbC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNvdXJjZWNoZWNrUmVzdWx0XCIpfX08L2gxPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGljZSBkLWZsZXggYmctbGlnaHQtd2FybmluZyByb3VuZGVkIGJvcmRlci13YXJuaW5nIGJvcmRlciBib3JkZXItZGFzaGVkIG1iLTEwIHAtNlwiPlxyXG4gICAgICAgIDwhLS1iZWdpbjo6SWNvbi0tPlxyXG4gICAgICAgIDwhLS1iZWdpbjo6U3ZnIEljb24gfCBwYXRoOiBpY29ucy9kdW90dW5lL2dlbmVyYWwvZ2VuMDQ0LnN2Zy0tPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMnR4IHN2Zy1pY29uLXdhcm5pbmcgbWUtNFwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9nZW4wNDQuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPCEtLWVuZDo6U3ZnIEljb24tLT5cclxuICAgICAgICA8IS0tZW5kOjpJY29uLS0+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpXcmFwcGVyLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXN0YWNrIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICA8IS0tYmVnaW46OkNvbnRlbnQtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1ib2xkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy02IHRleHQtZ3JheS03MDBcIiAqbmdJZj1cIiFFeGNlbFZhbGlkYXRpb24uaXNWYWxpZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJVcGRhdGVkRW50cmllc051bWJlclwiKX19IHt7RXhjZWxWYWxpZGF0aW9uLnZhbGlkQ291bnR9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJJbnZhbGlkRW50cmllc051bWJlclwiKX19IHt7RXhjZWxWYWxpZGF0aW9uLmludmFsaWRDb3VudH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtNiB0ZXh0LWdyYXktNzAwXCIgKm5nSWY9XCJFeGNlbFZhbGlkYXRpb24uaXNWYWxpZFwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFsbEVudHJpZXNWYWxpZFwiKX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPCEtLWVuZDo6Q29udGVudC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS1lbmQ6OldyYXBwZXItLT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhRXhjZWxWYWxpZGF0aW9uLmlzVmFsaWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc291cmNlSWRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNvdXJjZVNldFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkVycm9yTWVzc2FnZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ckl0ZW1cIiAqbmdGb3I9XCJsZXQgTG9jYWxpemF0aW9uIG9mIEV4Y2VsVmFsaWRhdGlvbi5pbnZhbGlkRW50cmllc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7TG9jYWxpemF0aW9uLnJlc291cmNlSWR9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57e0xvY2FsaXphdGlvbi5yZXNvdXJjZVNldH19PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZD57e0xvY2FsaXphdGlvbi5lcnJvck1lc3NhZ2V9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICNDbG9zZVJlc291cmNlVmFsaWRhdGlvbk1vZGFsIGlkPVwiQ2xvc2VSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNvbmZpcm1FeGNlbCgpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2F2ZUxhYmVsXCIpfX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiJdfQ==
|
|
495
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2xvY2FsaXphdGlvbnMvbG9jYWxpemF0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2xvY2FsaXphdGlvbnMvbG9jYWxpemF0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1UyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUUxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBR2xGLE9BQU8sRUFBRSxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVbkMsTUFBTSxPQUFPLHNCQUFzQjtJQXNGakMsWUFFVSxlQUErQixFQUMvQixjQUE2QixFQUM3QixrQkFBcUMsRUFDckMsUUFBa0Is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Z0JBUUcseUJBQXlCO3NCQUFuRixTQUFTO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFNTyw4QkFBOEI7c0JBQTdGLFNBQVM7dUJBQUMsZ0NBQWdDLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQU9DLDRCQUE0QjtzQkFBekYsU0FBUzt1QkFBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0EsMkJBQTJCO3NCQUF2RixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDRyw0QkFBNEI7c0JBQXpGLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlT3B0aW9ucywgRHJvcGRvd25PcHRpb25zLCBGaWxlVXBsb2FkT3B0aW9ucywgRmlsZVR5cGUsIEZpbHRlckl0ZW0sIEZpbHRlclR5cGUsIElucHV0VHlwZSwgUGFnaW5nT3B0aW9ucywgVGV4dEFyZWFPcHRpb25zLCBUZXh0Qm94T3B0aW9ucywgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zLCBFbmdsaXNoQXJhYmljRFRPLCBGb3JtT3B0aW9ucywgQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zLCBTdHlsZUNvbmZpcm1hdGlvbk1vZGUgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scyc7XHJcbmltcG9ydCB7IEVkaXRSZXNvdXJjZU1vZGVsIH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9Mb2NhbGl6YXRpb25Nb2RlbHMvRWRpdFJlc291cmNlTW9kZWwnO1xyXG5pbXBvcnQgeyBsb2NhbGl6YXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9TZXJ2aWNlcy9sb2NhbGl6YXRpb25zU2VydmljZS5zZXJ2aWNlICc7XHJcbmltcG9ydCB7IFVwbG9hZEpzb25WTSB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvTG9jYWxpemF0aW9uTW9kZWxzL1VwbG9hZEpzb25WTSc7XHJcbmltcG9ydCB7IENsaXBib2FyZFNlcnZpY2UgfSBmcm9tICduZ3gtY2xpcGJvYXJkJztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9fbWV0cm9uaWMvY29yZS9zZXJ2aWNlcy9wYWdlLWluZm8uc2VydmljZSc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyAgVXRpbGl0eVNlcnZpY2UsIEVudmlyb25tZW50U2VydmljZSwgUmVxdWVzdEhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgc2F2ZUFzfSBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgUGFnaW5nQ29tcG9uZW50IH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMvbGliL2NvbnRyb2xzL1BhZ2luZy9QYWdpbmcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudCB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLWNvbnRyb2xzL2xpYi9jb250cm9scy9Db25maXJtYXRpb25Nb2RhbC9Db25maXJtYXRpb25Nb2RhbC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbG9jYWxpemF0aW9ucycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2xvY2FsaXphdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xvY2FsaXphdGlvbnMuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2NhbGl6YXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0ICxPbkRlc3Ryb3kge1xyXG5cclxuICAvL1BhZ2UgcmVxdWlyZW1lbnRzIFxyXG4gIEFwaVVybCA9dGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5BcGlVcmxcclxuICBQcm9kdWN0aW9uTW9kZTogYm9vbGVhbjtcclxuXHJcbiAgLy9GaWx0ZXIgYW5kIHBhZ2luZyBjb21wb25lbnRzXHJcbiAgcmVzb3VyY2VTZXRPcHRpb25zOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgc2VhcmNoVGV4dEJveDogVGV4dEJveE9wdGlvbnM7XHJcbiAgc2VsZWN0ZWRMb2NhbGl6YXRpb25MaXN0ID0gW107XHJcbiAgcmVzb3VyY2VTZXRMaXN0ID0gW107XHJcbiAgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGxvY2FsaXphdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBzaG93RmlsdGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbG9jYWxpemF0aW9uUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkTG9jYWxpemF0aW9uUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIGxvY2FsaXphdGlvblBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICByZXNvdXJjZVNldEZpbHRlcjogRmlsdGVySXRlbTtcclxuICB0ZXh0SW5wdXRGaWx0ZXI6IEZpbHRlckl0ZW07XHJcbiAgaXNGaWx0ZXJMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdMb2NhbGl6YXRpb25QYWdpbmdWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwYWdpbmdFbGVtZW50OiBQYWdpbmdDb21wb25lbnQ7XHJcblxyXG5cclxuICAvL0FkZCBNb2RlbCBDb250cm9sc1xyXG4gIGFkZFJlc291cmNlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGFkZFJlc291cmNlRm9ybU9wdGlvbnM6IEZvcm1PcHRpb25zXHJcbiAgcmVzb3VyY2VTZXQ6IEF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgcmVzb3VyY2VJZDogVGV4dEJveE9wdGlvbnM7XHJcbiAgbXVsdGlMaW5ndWFsVmFsdWU6TXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zXHJcbiAgbXVsdGlMaW5ndWFsQ29tbWVudDpNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnNcclxuXHJcbiAgLy9FZGl0IE1vZGVsIENvbnRyb2xzXHJcbiAgZWRpdFJlc291cmNlRm9ybU9wdGlvbnM6IEZvcm1PcHRpb25zXHJcbiAgZWRpdFJlc291cmNlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGVkaXRNdWx0aUxpbmd1YWxWYWx1ZTpNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnNcclxuICBlZGl0TXVsdGlMaW5ndWFsQ29tbWVudDpNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnNcclxuICBlZGl0UmVzb3VyY2VJZDogc3RyaW5nO1xyXG4gIGVkaXRSZXNvdXJjZVNldDogc3RyaW5nO1xyXG4gXHJcbiAgLy9HZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzc1xyXG4gIGdlbmVyYXRlQ29kZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBzdHJvbmdseVR5cGVkQ2xhc3M6IFRleHRBcmVhT3B0aW9ucztcclxuICB2YWx1ZVRvQ29weTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgLy9VcGxvYWQgTW9kZWwgQ29udHJvbHNcclxuICB1cGxvYWRKc29uRmlsZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICB1cGxvYWRKc29uRmlsZUZvcm1PcHRpb25zOiBGb3JtT3B0aW9uc1xyXG4gIHVwbG9hZFJlc291cmNlU2V0T3B0aW9uczogRHJvcGRvd25PcHRpb25zO1xyXG4gIHJlc291cmNlc0ZpbGVJbnB1dDogRmlsZVVwbG9hZE9wdGlvbnM7XHJcblxyXG4gIC8vZGVsZXRlIE1vZGVsIENvbnRyb2xzXHJcbiAgZGVsZXRlUmVzb3VyY2VMaXN0OiBhbnlbXSA9IFtdXHJcbiAgZGVsZXRlQ29uZmlybWF0aW9uT3B0aW9uczogQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zO1xyXG4gIGRlbGV0ZUNvbnRyb2xMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdDb25maXJtYXRpb25Nb2RhbENvbnRyb2wnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ29uZmlybWF0aW9uTW9kYWxDb250cm9sOiBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudDtcclxuXHJcblxyXG5cclxuICBcclxuICAvL0V4cG9ydCBFeGNlbCAgQ29udHJvbHNcclxuICBleHBvcnRDb25maXJtYXRpb25PcHRpb25zOiBDb25maXJtYXRpb25Nb2RhbE9wdGlvbnM7XHJcbiAgZXhwb3J0Q29udHJvbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ2V4cG9ydENvbmZpcm1hdGlvbkNvbnRyb2wnLCB7IHN0YXRpYzogZmFsc2UgfSkgZXhwb3J0Q29uZmlybWF0aW9uQ29udHJvbDogQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ7XHJcblxyXG5cclxuICAvL1JlbG9hZCBKc29uIE1vZGVsIENvbnRyb2xzXHJcbiAgcmVsb2FkQ29uZmlybWF0aW9uT3B0aW9uczogQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zO1xyXG4gIHJlbG9hZENvbnRyb2xMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdSZWxvYWRDb25maXJtYXRpb25Nb2RhbENvbnRyb2wnLCB7IHN0YXRpYzogZmFsc2UgfSkgcmVsb2FkQ29uZmlybWF0aW9uTW9kYWxDb250cm9sOiBDb25maXJtYXRpb25Nb2RhbENvbXBvbmVudDtcclxuXHJcblxyXG5cclxuICAgLy9SZXN0IFRvIEZhY3RvcnkgRGVmYXVsdCAgQ29udHJvbHNcclxuICAgcmVzdFRvRmFjdG9yeURlZmF1bHRDb25maXJtYXRpb25PcHRpb25zOiBDb25maXJtYXRpb25Nb2RhbE9wdGlvbnM7XHJcbiAgIHJlc3RUb0ZhY3RvcnlEZWZhdWx0Q29udHJvbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICBAVmlld0NoaWxkKCdSZXN0Q29uZmlybWF0aW9uTW9kYWxDb250cm9sJywgeyBzdGF0aWM6IGZhbHNlIH0pIHJlc3RDb25maXJtYXRpb25Nb2RhbENvbnRyb2w6IENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50O1xyXG5cclxuXHJcbiBcclxuXHJcbiAgLy9SZXNvdXJjZVZhbGlkYXRpb25Nb2RhbENvbnRyb2xzXHJcbiAgZXhjZWxWYWxpZGF0aW9uOmFueTtcclxuICBAVmlld0NoaWxkKCdTaG93UmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgU2hvd1Jlc291cmNlVmFsaWRhdGlvbk1vZGFsOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ2xvc2VSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbDogRWxlbWVudFJlZjtcclxuXHJcbiBcclxuICBjb25zdHJ1Y3RvclxyXG4gIChcclxuICAgIHByaXZhdGUgcGFnZUluZm9TZXJ2aWNlOlBhZ2VJbmZvU2VydmljZSxcclxuICAgIHB1YmxpYyAgdXRpbGl0eVNlcnZpY2U6VXRpbGl0eVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVudmlyb25tZW50U2VydmljZTpFbnZpcm9ubWVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgIHByaXZhdGUgX2NsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxvY2FsaXphdGlvbnNTZXJ2aWNlOiBsb2NhbGl6YXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcmVxdWVzdEhhbmRsZXJTZXJ2aWNlOlJlcXVlc3RIYW5kbGVyU2VydmljZVxyXG4gIClcclxuICB7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKVxyXG4gICB7XHJcbiAgICAgLy9QYWdlIGhlYWRlciAoYnJlYWRjcnVtYiBhbmQgdGl0bGUpXHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZVRpdGxlPXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkxvY2FsaXphdGlvblwiKVxyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VCcmVhZGNydW1icz1bXHJcbiAgICAgICB7dGl0bGU6IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkhvbWVcIikgLCBwYXRoOiAnL0FkbWluL0hvbWUnLCBpc1NlcGFyYXRvcjogZmFsc2UsIGlzQWN0aXZlOiBmYWxzZX0sXHJcbiAgICAgICB7dGl0bGU6ICcnLCBwYXRoOiAnJywgaXNTZXBhcmF0b3I6IHRydWUsIGlzQWN0aXZlOiBmYWxzZX1cclxuXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLlByb2R1Y3Rpb25Nb2RlID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0UHJvZHVjdGlvbk1vZGUoKVxyXG4gICAgLy9pbml0aWFsaXplIHBhZ2VcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVBhZ2UoKTtcclxuICB9XHJcbiAvL1BhZ2luZyBmdW5jdGlvbnNcclxuICBzZXRMb2NhbGl6YXRpb25MaXN0UmVzdWx0KHJlc3VsdCkgXHJcbiAge1xyXG4gICAgdGhpcy5sb2NhbGl6YXRpb25QYWdpbmdSZXN1bHQgPSByZXN1bHRcclxuICAgIHRoaXMuZmlsdGVyZWRMb2NhbGl6YXRpb25QYWdpbmdSZXN1bHQgPSB0aGlzLmxvY2FsaXphdGlvblBhZ2luZ1Jlc3VsdFxyXG5cclxuICB9XHJcblxyXG4gIHJlc2V0RmlsdGVycygpIHtcclxuICAgIHRoaXMubG9jYWxpemF0aW9uRm9ybS5jb250cm9sc1tcIlJlc291cmNlU2V0XCJdLnNldFZhbHVlKFtdKTtcclxuICAgIHRoaXMubG9jYWxpemF0aW9uRm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0uc2V0VmFsdWUobnVsbCk7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMucGFnaW5nRWxlbWVudCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG5cclxuICB9XHJcblxyXG4gIHNlbGVjdEFsbExvY2FsaXphdGlvbkxpc3QoZXZlbnQsIExvY2FsaXphdGlvbnMpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTG9jYWxpemF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBMb2NhbGl6YXRpb24gPSBMb2NhbGl6YXRpb25zW2luZGV4XTtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJMb2NhbGl6YXRpb24tXCIgKyBMb2NhbGl6YXRpb24uUmVzb3VyY2VJZCk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYWxpemF0aW9uTGlzdC5wdXNoKExvY2FsaXphdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IExvY2FsaXphdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgTG9jYWxpemF0aW9uID0gTG9jYWxpemF0aW9uc1tpbmRleF07XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiTG9jYWxpemF0aW9uLVwiICsgTG9jYWxpemF0aW9uLlJlc291cmNlSWQpO1xyXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9jYWxpemF0aW9uTGlzdCA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZEZpbHRlcnMoKSB7XHJcbiAgICBpZiAodGhpcy5zaG93RmlsdGVyID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLnNob3dGaWx0ZXIgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93RmlsdGVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgaW5pdGlhbGl6ZVBhZ2UoKSB7XHJcblxyXG4gICAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5sb2FkRHJvcGRvd24oKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLnJlc291cmNlU2V0TGlzdCA9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgLy8gUmVzb3VyY2UgU2V0IEluaXQgICBcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldE9wdGlvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VTZXRPcHRpb25zLk5hbWUgPSBcIlJlc291cmNlU2V0XCJcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldE9wdGlvbnMuTGFiZWxLZXkgPSBcIlJlc291cmNlU2V0XCJcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldE9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMucmVzb3VyY2VTZXRMaXN0XHJcbiAgICAgIHRoaXMucmVzb3VyY2VTZXRPcHRpb25zLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMucmVzb3VyY2VTZXRPcHRpb25zLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldE9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG5cclxuICAgICAgLy8gVGV4dEJveCBpbnRpXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5IaWRlTGFiZWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guVHlwZSA9IElucHV0VHlwZS5UZXh0XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZU9yUmVzb3VyY2VJRFwiKVxyXG4gICAgICBcclxuXHJcblxyXG4gICAgICB0aGlzLnJlc291cmNlU2V0RmlsdGVyID0gbmV3IEZpbHRlckl0ZW0oKTtcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldEZpbHRlci5Gb3JtQ29udHJvbE5hbWUgPSBcIlJlc291cmNlU2V0XCJcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJyZXNvdXJjZVNldFwiXHJcbiAgICAgIHRoaXMucmVzb3VyY2VTZXRGaWx0ZXIuSXNGb3JtQ29udHJvbCA9IHRydWVcclxuICAgICAgdGhpcy5yZXNvdXJjZVNldEZpbHRlci5GaWx0ZXJUeXBlID0gRmlsdGVyVHlwZS5Ecm9wZG93bkxpc3RcclxuXHJcblxyXG4gICAgICB0aGlzLnRleHRJbnB1dEZpbHRlciA9IG5ldyBGaWx0ZXJJdGVtKCk7XHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyLkZvcm1Db250cm9sTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyLkFjdGlvblBhcmFtZXRlck5hbWUgPSBcInJlc291cmNlTmFtZVwiXHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyLklzRm9ybUNvbnRyb2wgPSB0cnVlXHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyLkZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlLlRleHRCb3hcclxuXHJcblxyXG4gICAgICB0aGlzLmxvY2FsaXphdGlvblBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMubG9jYWxpemF0aW9uUGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLkFwaVVybCArICdHZXRMb2NhbGl6YXRpb25zQnlGaWx0ZXInO1xyXG4gICAgICB0aGlzLmxvY2FsaXphdGlvblBhZ2luZy5PbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcyA9IFtcInNlYXJjaFRleHRCb3hcIl1cclxuICAgICAgdGhpcy5sb2NhbGl6YXRpb25QYWdpbmcuRHJvcGRvd25GaWx0ZXJzQ29udHJvbE5hbWVzID0gW1wiUmVzb3VyY2VTZXRcIl07XHJcbiAgICAgIHRoaXMubG9jYWxpemF0aW9uUGFnaW5nLkZpbHRlcnMgPSBbdGhpcy5yZXNvdXJjZVNldEZpbHRlciwgdGhpcy50ZXh0SW5wdXRGaWx0ZXJdXHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmlzRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gXHJcbiAgIC8vLy8vLy8vLy8vU3RhcnQgb2YgRXhwb3J0IHBhcnQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiBzaG93RXhwb3J0RXhjZWxNb2RhbChFeHBvcnRBc1RlbXBsYXRlOmJvb2xlYW49ZmFsc2UpIHtcclxuICBsZXQgcGFyYW1BcnJheTogYW55W10gPSBbXTtcclxuICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKFwicmVzb3VyY2VTZXRcIiwgdGhpcy5sb2NhbGl6YXRpb25Gb3JtLmNvbnRyb2xzW1wiUmVzb3VyY2VTZXRcIl0udmFsdWUgPT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMubG9jYWxpemF0aW9uRm9ybS5jb250cm9sc1tcIlJlc291cmNlU2V0XCJdLnZhbHVlKTtcclxuICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKFwicmVzb3VyY2VOYW1lXCIsIHRoaXMubG9jYWxpemF0aW9uRm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0udmFsdWUgPT0gdW5kZWZpbmVkID8gXCJcIiA6IHRoaXMubG9jYWxpemF0aW9uRm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0udmFsdWUpO1xyXG4gIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoXCJleHBvcnRBc1RlbXBsYXRlXCIsRXhwb3J0QXNUZW1wbGF0ZS50b1N0cmluZygpKTtcclxuICBwYXJhbUFycmF5LnB1c2gocGFyYW1zKTtcclxuICAgIFxyXG4gIHRoaXMuZXhwb3J0Q29udHJvbExvYWRlZD0gZmFsc2U7XHJcbiAgdGhpcy5leHBvcnRDb25maXJtYXRpb25PcHRpb25zID0gbmV3IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucygpO1xyXG4gIHRoaXMuZXhwb3J0Q29uZmlybWF0aW9uT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLmV4cG9ydEV4Y2VsRnVuY3Rpb247XHJcbiAgdGhpcy5leHBvcnRDb25maXJtYXRpb25PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudDtcclxuICB0aGlzLmV4cG9ydENvbmZpcm1hdGlvbk9wdGlvbnMuT25TdWNjZXNzSGFuZGxlciA9IHRoaXMub25FeHBvcnRTdWNjZXNzSGFuZGxlcjtcclxuICB0aGlzLmV4cG9ydENvbmZpcm1hdGlvbk9wdGlvbnMuU2VydmljZVN1Ym1pdE1vZGVsID0gcGFyYW1BcnJheTtcclxuICB0aGlzLmV4cG9ydENvbmZpcm1hdGlvbk9wdGlvbnMuQ29uZmlybWF0aW9uQm9keT10aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFeHBvcnRSZXNvdXJjZXNDb25maXJtYXRpb25cIik7XHJcbiAgdGhpcy5leHBvcnRDb25maXJtYXRpb25PcHRpb25zLkNvbmZpcm1hdGlvbkhlYWRlcj10aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFeHBvcnRSZXNvdXJjZXNcIik7XHJcbiAgdGhpcy5leHBvcnRDb25maXJtYXRpb25PcHRpb25zLlN1Ym1pdEJ1dHRvblRleHQ9dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXhwb3J0XCIpO1xyXG4gIHRoaXMuZXhwb3J0Q29uZmlybWF0aW9uT3B0aW9ucy5TdHlsZUNvbmZpcm1hdGlvbk1vZGU9U3R5bGVDb25maXJtYXRpb25Nb2RlLldhcm5pbmc7XHJcbiAgdGhpcy5leHBvcnRDb25maXJtYXRpb25PcHRpb25zLlN1Y2Nlc3NOb3RpZmljYXRpb25NZXNzYWdlPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdWNjZXNzTWVzc2FnZVwiKTtcclxuICB0aGlzLmV4cG9ydENvbnRyb2xMb2FkZWQgPSB0cnVlO1xyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgdGhpcy5leHBvcnRDb25maXJtYXRpb25Db250cm9sLnNob3dNb2RhbCgpO1xyXG4gIH0sIDIwMCk7XHJcbn1cclxuXHJcbmV4cG9ydEV4Y2VsRnVuY3Rpb24gPSAocGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5leHBvcnQocGFyYW1zKTtcclxufVxyXG5vbkV4cG9ydFN1Y2Nlc3NIYW5kbGVyPShyZXN1bHQpPT57XHJcbiAgbGV0IEZpbGVEVE8gPSByZXN1bHQgYXMgYW55XHJcbiAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtGaWxlRFRPXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xyXG4gIHNhdmVBcyhmaWxlLCBgTG9jYWxpemF0aW9ucyR7dGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0obmV3IERhdGUoKSxcImRkLU1NLVlZWVkgaGg6bW1cIikudG9TdHJpbmcoKX0ueGxzeGApO1xyXG4gIGxldCBlbGVtZW50ID0gdGhpcy5wYWdpbmdFbGVtZW50IGFzIGFueTtcclxuICBlbGVtZW50LlVwZGF0ZVBhZ2luZygpO1xyXG59XHJcbi8vLy8vLy8vLy8vRW5kIG9mIEV4cG9ydCBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgLy8vLy8vLy8vLy8vLyBTdGFydCBhZGQgUmVzb3VyY2UgUGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICBzaG93QWRkUmVzb3VyY2VNb2RhbChhZGRSZXNvdXJjZU1vZGFsKSB7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG4gICAgdGhpcy5hZGRSZXNvdXJjZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgICB0aGlzLmFkZFJlc291cmNlRm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnMoKTtcclxuICAgIHRoaXMuYWRkUmVzb3VyY2VGb3JtT3B0aW9ucy5Gb3JtR3JvdXAgPSB0aGlzLmFkZFJlc291cmNlRm9ybVxyXG4gICAgdGhpcy5hZGRSZXNvdXJjZUZvcm1PcHRpb25zLkdldE1vZGVsRnVuY3Rpb24gPSB0aGlzLmdldEFkZFJlc291cmNlTW9kYWw7XHJcbiAgICB0aGlzLmFkZFJlc291cmNlRm9ybU9wdGlvbnMuU2VydmljZVN1Ym1pdEZ1bmN0aW9uID0gdGhpcy5nZXRBZGRSZXNvdXJjZUZ1bmN0aW9uO1xyXG4gICAgdGhpcy5hZGRSZXNvdXJjZUZvcm1PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudFxyXG5cclxuICAgIHRoaXMucmVzb3VyY2VTZXQgPSBuZXcgQXV0b2NvbXBsZXRlT3B0aW9ucygpO1xyXG4gICAgdGhpcy5yZXNvdXJjZVNldC5OYW1lID0gXCJSZXNvdXJjZVNldFwiO1xyXG4gICAgdGhpcy5yZXNvdXJjZVNldC5MYWJlbEtleSA9IFwiUmVzb3VyY2VTZXRcIjtcclxuICAgIHRoaXMucmVzb3VyY2VTZXQuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgdGhpcy5yZXNvdXJjZVNldC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIHRoaXMucmVzb3VyY2VTZXQuVmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNvdXJjZVNldC5BY3Rpb25VUkwgPSAgdGhpcy5BcGlVcmwgKyBcIkF1dG9Db21wbGV0ZVJlc291cmNlU2V0XCJcclxuICAgXHJcbiAgICB0aGlzLnJlc291cmNlSWQgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgIHRoaXMucmVzb3VyY2VJZC5OYW1lID0gXCJSZXNvdXJjZUlkXCI7XHJcbiAgICB0aGlzLnJlc291cmNlSWQuTGFiZWxLZXkgPSBcIlJlc291cmNlSWRcIjtcclxuICAgIHRoaXMucmVzb3VyY2VJZC5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICB0aGlzLnJlc291cmNlSWQuVmFsdWUgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNvdXJjZUlkLklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMubXVsdGlMaW5ndWFsVmFsdWUgPSBuZXcgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zKCk7XHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbFZhbHVlLk5hbWUgPSBcIlZhbHVlXCI7XHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbFZhbHVlLkFyYWJpY0xhYmVsS2V5ID0gIFwiVmFsdWVJbkFyYWJpY1wiO1xyXG4gICAgdGhpcy5tdWx0aUxpbmd1YWxWYWx1ZS5FbmdsaXNoTGFiZWxLZXkgPSBcIlZhbHVlSW5FbmdsaXNoXCI7XHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbFZhbHVlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgXHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbENvbW1lbnQgPSBuZXcgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zKCk7XHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbENvbW1lbnQuTmFtZSA9IFwiQ29tbWVudFwiO1xyXG4gICAgdGhpcy5tdWx0aUxpbmd1YWxDb21tZW50LkFyYWJpY0xhYmVsS2V5ID0gIFwiQ29tbWVudEluQXJhYmljXCI7XHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbENvbW1lbnQuRW5nbGlzaExhYmVsS2V5ID0gXCJDb21tZW50SW5FbmdsaXNoXCI7XHJcblxyXG5cclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oYWRkUmVzb3VyY2VNb2RhbCk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0QWRkUmVzb3VyY2VNb2RhbCA9ICgpID0+IHtcclxuICAgIGxldCBwYXJhbUFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IFJlc3VsdE1vZGVsID0gdGhpcy5hZGRSZXNvdXJjZUZvcm0udmFsdWU7XHJcbiAgICBsZXQgQWRkTW9kZWwgPSBuZXcgRWRpdFJlc291cmNlTW9kZWwoKTtcclxuICAgIEFkZE1vZGVsLlJlc291cmNlSWQgPSBSZXN1bHRNb2RlbC5SZXNvdXJjZUlkO1xyXG4gICAgQWRkTW9kZWwuUmVzb3VyY2VTZXQgPSBSZXN1bHRNb2RlbC5SZXNvdXJjZVNldC52YWx1ZTtcclxuICAgIEFkZE1vZGVsLlZhbHVlRU4gPSBSZXN1bHRNb2RlbC5WYWx1ZS5FbmdsaXNoVGV4dEFyZWFWYWx1ZTtcclxuICAgIEFkZE1vZGVsLlZhbHVlQVIgPSBSZXN1bHRNb2RlbC5WYWx1ZS5BcmFiaWNUZXh0QXJlYVZhbHVlO1xyXG4gICAgQWRkTW9kZWwuQ29tbWVudEFyID0gUmVzdWx0TW9kZWwuQ29tbWVudC5BcmFiaWNUZXh0QXJlYVZhbHVlO1xyXG4gICAgQWRkTW9kZWwuQ29tbWVudEVuID0gUmVzdWx0TW9kZWwuQ29tbWVudC5FbmdsaXNoVGV4dEFyZWFWYWx1ZTtcclxuXHJcbiAgICBwYXJhbUFycmF5LnB1c2goQWRkTW9kZWwpO1xyXG4gICAgcmV0dXJuIHBhcmFtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXRBZGRSZXNvdXJjZUZ1bmN0aW9uID0gKEFkZE1vZGVsKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5hZGRSZXNvdXJjZShBZGRNb2RlbClcclxuICB9XHJcbiAgLy8vLy8vLy8vLy8vIEVuZCBvZiBhZGQgUmVzb3VyY2UgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuXHJcblxyXG5cclxuICBcclxuICAvLy8vLy8vLy8vL1N0YXJ0IG9mIGVkaXQgUmVzb3VyY2UgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICBzaG93RWRpdFJlc291cmNlTW9kYWwocmVzb3VyY2U6IGFueSwgZWRpdFJlc291cmNlTW9kYWwpIHtcclxuXHJcbiAgICB0aGlzLmVkaXRSZXNvdXJjZUZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRSZXNvdXJjZUlkID0gcmVzb3VyY2UucmVzb3VyY2VJZFxyXG4gICAgdGhpcy5lZGl0UmVzb3VyY2VTZXQgPSByZXNvdXJjZS5yZXNvdXJjZVNldFxyXG5cclxuICAgIHRoaXMuZWRpdFJlc291cmNlRm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnMoKTtcclxuICAgIHRoaXMuZWRpdFJlc291cmNlRm9ybU9wdGlvbnMuRm9ybUdyb3VwID0gdGhpcy5lZGl0UmVzb3VyY2VGb3JtXHJcbiAgICB0aGlzLmVkaXRSZXNvdXJjZUZvcm1PcHRpb25zLkdldE1vZGVsRnVuY3Rpb24gPSB0aGlzLmdldEVkaXRSZXNvdXJjZU1vZGVsO1xyXG4gICAgdGhpcy5lZGl0UmVzb3VyY2VGb3JtT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLmdldEVkaXRSZXNvdXJjZUZ1bmN0aW9uO1xyXG4gICAgdGhpcy5lZGl0UmVzb3VyY2VGb3JtT3B0aW9ucy5QYWdpbmdSZWZlcmVuY2UgPSB0aGlzLnBhZ2luZ0VsZW1lbnRcclxuXHJcblxyXG5cclxuICAgIHRoaXMubG9jYWxpemF0aW9uc1NlcnZpY2UuZ2V0UmVzb3VyY2UodGhpcy5lZGl0UmVzb3VyY2VTZXQsdGhpcy5lZGl0UmVzb3VyY2VJZCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgUmVzb3VyY2UgPSByZXN1bHQubW9kZWwgYXMgYW55O1xyXG4gICAgICBsZXQgVmFsdWU9bmV3IEVuZ2xpc2hBcmFiaWNEVE8oKTtcclxuICAgICAgVmFsdWUuQXJhYmljPVJlc291cmNlLnZhbHVlQVI7XHJcbiAgICAgIFZhbHVlLkVuZ2xpc2g9UmVzb3VyY2UudmFsdWVFTjtcclxuICBcclxuICAgICAgdGhpcy5lZGl0TXVsdGlMaW5ndWFsVmFsdWUgPSBuZXcgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbFZhbHVlLk5hbWUgPSBcIlZhbHVlXCI7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbFZhbHVlLkFyYWJpY0xhYmVsS2V5ID0gIFwiVmFsdWVJbkFyYWJpY1wiO1xyXG4gICAgICB0aGlzLmVkaXRNdWx0aUxpbmd1YWxWYWx1ZS5FbmdsaXNoTGFiZWxLZXkgPSBcIlZhbHVlSW5FbmdsaXNoXCI7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbFZhbHVlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVkaXRNdWx0aUxpbmd1YWxWYWx1ZS5WYWx1ZSA9IFZhbHVlO1xyXG4gIFxyXG4gIFxyXG4gICAgICBsZXQgQ29tbWVudD1uZXcgRW5nbGlzaEFyYWJpY0RUTygpO1xyXG4gICAgICBDb21tZW50LkFyYWJpYz1SZXNvdXJjZS5jb21tZW50QXI7XHJcbiAgICAgIENvbW1lbnQuRW5nbGlzaD1SZXNvdXJjZS5jb21tZW50RW47XHJcbiAgXHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbENvbW1lbnQgPSBuZXcgTXVsdGlMaW5ndWFsVGV4dEFyZWFPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbENvbW1lbnQuTmFtZSA9IFwiQ29tbWVudFwiO1xyXG4gICAgICB0aGlzLmVkaXRNdWx0aUxpbmd1YWxDb21tZW50LkFyYWJpY0xhYmVsS2V5ID0gIFwiQ29tbWVudEluQXJhYmljXCI7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbENvbW1lbnQuRW5nbGlzaExhYmVsS2V5ID0gXCJDb21tZW50SW5FbmdsaXNoXCI7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbENvbW1lbnQuVmFsdWUgPSBDb21tZW50O1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGVkaXRSZXNvdXJjZU1vZGFsKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGdldEVkaXRSZXNvdXJjZU1vZGVsID0gKCkgPT4ge1xyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLmVkaXRSZXNvdXJjZUZvcm0udmFsdWU7XHJcbiAgICBsZXQgRWRpdE1vZGVsID0gbmV3IEVkaXRSZXNvdXJjZU1vZGVsKCk7XHJcbiAgICBFZGl0TW9kZWwuUmVzb3VyY2VJZCA9IHRoaXMuZWRpdFJlc291cmNlSWQ7XHJcbiAgICBFZGl0TW9kZWwuUmVzb3VyY2VTZXQgPSB0aGlzLmVkaXRSZXNvdXJjZVNldDtcclxuICAgIEVkaXRNb2RlbC5WYWx1ZUVOID0gUmVzdWx0TW9kZWwuVmFsdWUuRW5nbGlzaFRleHRBcmVhVmFsdWU7XHJcbiAgICBFZGl0TW9kZWwuVmFsdWVBUiA9IFJlc3VsdE1vZGVsLlZhbHVlLkFyYWJpY1RleHRBcmVhVmFsdWU7XHJcbiAgICBFZGl0TW9kZWwuQ29tbWVudEVuID0gUmVzdWx0TW9kZWwuQ29tbWVudC5FbmdsaXNoVGV4dEFyZWFWYWx1ZTtcclxuICAgIEVkaXRNb2RlbC5Db21tZW50QXIgPSBSZXN1bHRNb2RlbC5Db21tZW50LkFyYWJpY1RleHRBcmVhVmFsdWU7XHJcblxyXG4gICAgcGFyYW1BcnJheS5wdXNoKEVkaXRNb2RlbCk7XHJcbiAgICByZXR1cm4gcGFyYW1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldEVkaXRSZXNvdXJjZUZ1bmN0aW9uID0gKEVkaXRNb2RlbCk6IE9ic2VydmFibGU8YW55PiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5lZGl0UmVzb3VyY2UoRWRpdE1vZGVsKVxyXG4gIH1cclxuICAvLy8vLy8vLy8vL0VuZCBvZiBlZGl0IFJlc291cmNlIHBhcnQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG5cclxuICBcclxuICAgIFxyXG4gICAvLy8vLy8vLy8vL1N0YXJ0IG9mIGRlbGV0ZSBSZXNvdXJjZSBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gICBzaG93RGVsZXRlUmVzb3VyY2VNb2RhbChyZXNvdXJjZTogYW55KSB7XHJcbiAgICBcclxuICAgIHRoaXMuZGVsZXRlQ29udHJvbExvYWRlZCA9IGZhbHNlO1xyXG4gICAgLy9hcnJheSBzZW50IHRvIHNlcnZpY2UgZnVuY3Rpb25cclxuICAgIGxldCBwYXJhbUFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgcGFyYW1BcnJheS5wdXNoKHJlc291cmNlLnJlc291cmNlU2V0KTtcclxuICAgIHBhcmFtQXJyYXkucHVzaChyZXNvdXJjZS5yZXNvdXJjZUlkKTtcclxuICAgIFxyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zID0gbmV3IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucygpO1xyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zLlNlcnZpY2VTdWJtaXRGdW5jdGlvbiA9IHRoaXMuZGVsZXRlUmVzb3VyY2VGdW5jdGlvbjtcclxuICAgIHRoaXMuZGVsZXRlQ29uZmlybWF0aW9uT3B0aW9ucy5TZXJ2aWNlU3VibWl0TW9kZWwgPSBwYXJhbUFycmF5O1xyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmRlbGV0ZUNvbnRyb2xMb2FkZWQgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ29uZmlybWF0aW9uTW9kYWxDb250cm9sLnNob3dNb2RhbCgpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVJlc291cmNlRnVuY3Rpb24gPSAocmVzb3VyY2VTZXQscmVzb3VyY2VJZCk6IE9ic2VydmFibGU8YW55PiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5kZWxldGVSZXNvdXJjZShyZXNvdXJjZVNldCxyZXNvdXJjZUlkKVxyXG4gIH1cclxuIC8vLy8vLy8vLy8vRW5kIG9mIGRlbGV0ZSBSZXNvdXJjZSBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuXHJcbiAvLy8vLy8vLy8vL1N0YXJ0IG9mICBSZWxvYWQgUmVzb3VyY2UgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuIHNob3dSZWxvYWRSZXNvdXJjZU1vZGFsKCkge1xyXG4gICAgXHJcbiAgdGhpcy5yZWxvYWRDb250cm9sTG9hZGVkPSBmYWxzZTtcclxuXHJcbiAgdGhpcy5yZWxvYWRDb25maXJtYXRpb25PcHRpb25zID0gbmV3IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucygpO1xyXG4gIHRoaXMucmVsb2FkQ29uZmlybWF0aW9uT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLnJlbG9hZFJlc291cmNlRnVuY3Rpb247XHJcbiAgdGhpcy5yZWxvYWRDb25maXJtYXRpb25PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudDtcclxuICB0aGlzLnJlbG9hZENvbmZpcm1hdGlvbk9wdGlvbnMuQ29uZmlybWF0aW9uQm9keT10aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZWxvYWRSZXNvdXJjZXNDb25maXJtYXRpb25cIik7XHJcbiAgdGhpcy5yZWxvYWRDb25maXJtYXRpb25PcHRpb25zLkNvbmZpcm1hdGlvbkhlYWRlcj10aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZWxvYWRSZXNvdXJjZXNcIik7XHJcbiAgdGhpcy5yZWxvYWRDb25maXJtYXRpb25PcHRpb25zLlN1Ym1pdEJ1dHRvblRleHQ9dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVsb2FkXCIpO1xyXG4gIHRoaXMucmVsb2FkQ29uZmlybWF0aW9uT3B0aW9ucy5TdHlsZUNvbmZpcm1hdGlvbk1vZGU9U3R5bGVDb25maXJtYXRpb25Nb2RlLldhcm5pbmc7XHJcbiAgdGhpcy5yZWxvYWRDb25maXJtYXRpb25PcHRpb25zLlN1Y2Nlc3NOb3RpZmljYXRpb25NZXNzYWdlPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdWNjZXNzTWVzc2FnZVwiKTtcclxuXHJcblxyXG4gIHRoaXMucmVsb2FkQ29udHJvbExvYWRlZCA9IHRydWU7XHJcbiAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICB0aGlzLnJlbG9hZENvbmZpcm1hdGlvbk1vZGFsQ29udHJvbC5zaG93TW9kYWwoKTtcclxuICB9LCAyMDApO1xyXG59XHJcblxyXG5yZWxvYWRSZXNvdXJjZUZ1bmN0aW9uID0gKCk6IE9ic2VydmFibGU8YW55PiA9PiB7XHJcbiAgcmV0dXJuIHRoaXMubG9jYWxpemF0aW9uc1NlcnZpY2UucmVsb2FkSnNvbkZpbGUoKVxyXG59XHJcbi8vLy8vLy8vLy8vRW5kIG9mIFJlbG9hZCBSZXNvdXJjZSBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuXHJcblxyXG4vLy8vLy8vLy8vL1N0YXJ0IG9mIFJlc3RUb0ZhY3RvcnlEZWZhdWx0IHBhcnQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbnNob3dSZXN0VG9GYWN0b3J5RGVmYXVsdCgpIHtcclxuICAgIFxyXG4gIHRoaXMucmVzdFRvRmFjdG9yeURlZmF1bHRDb250cm9sTG9hZGVkPSBmYWxzZTtcclxuXHJcbiAgdGhpcy5yZXN0VG9GYWN0b3J5RGVmYXVsdENvbmZpcm1hdGlvbk9wdGlvbnMgPSBuZXcgQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zKCk7XHJcbiAgdGhpcy5yZXN0VG9GYWN0b3J5RGVmYXVsdENvbmZpcm1hdGlvbk9wdGlvbnMuU2VydmljZVN1Ym1pdEZ1bmN0aW9uID0gdGhpcy5yZXN0VG9GYWN0b3J5RGVmYXVsdEZ1bmN0aW9uO1xyXG4gIHRoaXMucmVzdFRvRmFjdG9yeURlZmF1bHRDb25maXJtYXRpb25PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudDtcclxuICB0aGlzLnJlc3RUb0ZhY3RvcnlEZWZhdWx0Q29uZmlybWF0aW9uT3B0aW9ucy5Db25maXJtYXRpb25Cb2R5PXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc2V0VG9GYWN0b3J5Q29uZmlybWF0aW9uXCIpO1xyXG4gIHRoaXMucmVzdFRvRmFjdG9yeURlZmF1bHRDb25maXJtYXRpb25PcHRpb25zLkNvbmZpcm1hdGlvbkhlYWRlcj10aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJSZXNldFRvRmFjdG9yeURlZmF1bHRcIilcclxuICB0aGlzLnJlc3RUb0ZhY3RvcnlEZWZhdWx0Q29uZmlybWF0aW9uT3B0aW9ucy5TdWJtaXRCdXR0b25UZXh0PXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc3RcIik7XHJcbiAgdGhpcy5yZXN0VG9GYWN0b3J5RGVmYXVsdENvbmZpcm1hdGlvbk9wdGlvbnMuU3R5bGVDb25maXJtYXRpb25Nb2RlPVN0eWxlQ29uZmlybWF0aW9uTW9kZS5XYXJuaW5nO1xyXG4gIHRoaXMucmVzdFRvRmFjdG9yeURlZmF1bHRDb25maXJtYXRpb25PcHRpb25zLlN1Y2Nlc3NOb3RpZmljYXRpb25NZXNzYWdlPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdWNjZXNzTWVzc2FnZVwiKTtcclxuXHJcbiAgdGhpcy5yZXN0VG9GYWN0b3J5RGVmYXVsdENvbnRyb2xMb2FkZWQgPSB0cnVlO1xyXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgdGhpcy5yZXN0Q29uZmlybWF0aW9uTW9kYWxDb250cm9sLnNob3dNb2RhbCgpO1xyXG4gIH0sIDIwMCk7XHJcbn1cclxuXHJcbnJlc3RUb0ZhY3RvcnlEZWZhdWx0RnVuY3Rpb24gPSAoKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICByZXR1cm4gdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5yZXN0VG9GYWN0b3J5RGVmYXVsdCgpXHJcbn1cclxuLy8vLy8vLy8vLy9FbmQgb2YgUmVzdFRvRmFjdG9yeURlZmF1bHQgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcblxyXG5cclxuLy8vLy8vLy8vLy9TdGFydCBvZiBHZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzcyBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG5cclxuZ2VuZXJhdGVTdHJvbmdseVR5cGVkQ2xhc3MoZ2VuZXJhdGVTdHJvbmdseVR5cGVkTW9kYWwpIHtcclxuXHJcbiAgdGhpcy5nZW5lcmF0ZUNvZGVGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5nZW5lcmF0ZVN0cm9uZ2x5VHlwZWRDbGFzcygpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICB2YXIgVmFsdWUgPSByZXN1bHQgYXMgYW55XHJcbiAgICB0aGlzLnN0cm9uZ2x5VHlwZWRDbGFzcyA9IG5ldyBUZXh0QXJlYU9wdGlvbnMoKTtcclxuICAgIHRoaXMuc3Ryb25nbHlUeXBlZENsYXNzLk5hbWUgPSBcIkdlbmVyYXRlQ29kZVRleHRBcmVhXCI7XHJcbiAgICB0aGlzLnN0cm9uZ2x5VHlwZWRDbGFzcy5WYWx1ZSA9IFZhbHVlLnZhbC50b1N0cmluZygpO1xyXG4gICAgdGhpcy52YWx1ZVRvQ29weSA9IFZhbHVlLnZhbC50b1N0cmluZygpO1xyXG4gICAgdGhpcy5zdHJvbmdseVR5cGVkQ2xhc3MuSXNEaXNhYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnN0cm9uZ2x5VHlwZWRDbGFzcy5IaWRlTGFiZWwgPSB0cnVlO1xyXG4gICAgdGhpcy5zdHJvbmdseVR5cGVkQ2xhc3MuUm93cyA9IDIwO1xyXG4gICAgdGhpcy5zdHJvbmdseVR5cGVkQ2xhc3MuQ29scyA9IDIwO1xyXG4gICAgdGhpcy5zdHJvbmdseVR5cGVkQ2xhc3MuTWF4TGVuZ3RoID0gMTAwMDAwMDtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oZ2VuZXJhdGVTdHJvbmdseVR5cGVkTW9kYWwpO1xyXG4gIH0pO1xyXG59XHJcbmNvcHlJbnB1dE1lc3NhZ2UoKXtcclxuICB0aGlzLl9jbGlwYm9hcmRTZXJ2aWNlLmNvcHkodGhpcy52YWx1ZVRvQ29weS50b1N0cmluZygpKTtcclxufVxyXG5cclxuLy8vLy8vLy8vLy9FbmQgb2YgR2VuZXJhdGVTdHJvbmdseVR5cGVkQ2xhc3MgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcblxyXG4gIC8vIFJlc3RSZXNvdXJjZVRvRmFjdG9yeURlZmF1bHQoUmVzb3VyY2U6YW55KSB7XHJcbiAgLy8gICAgIGxldCBSZXNvdXJjZU1vZGVsID0gbmV3IEVkaXRSZXNvdXJjZU1vZGVsKCk7XHJcbiAgLy8gICAgIFJlc291cmNlTW9kZWwuUmVzb3VyY2VJZCA9IFJlc291cmNlLnJlc291cmNlSWQ7XHJcbiAgLy8gICAgIFJlc291cmNlTW9kZWwuUmVzb3VyY2VTZXQgPSBSZXNvdXJjZS5yZXNvdXJjZVNldDtcclxuICAvLyAgICAgUmVzb3VyY2VNb2RlbC5WYWx1ZUVOID0gXCJcIjtcclxuICAvLyAgICAgUmVzb3VyY2VNb2RlbC5WYWx1ZUFSID1cIlwiO1xyXG4gIC8vICAgICBSZXNvdXJjZU1vZGVsLkNvbW1lbnRFbiA9IFwiXCI7XHJcbiAgLy8gICAgIFJlc291cmNlTW9kZWwuQ29tbWVudEFyID0gXCJcIjtcclxuICAvLyAgICAgdGhpcy5sb2NhbGl6YXRpb25zU2VydmljZS5SZXN0UmVzb3VyY2VUb0ZhY3RvcnlEZWZhdWx0KFJlc291cmNlTW9kZWwpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICBcclxuICAvLyAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gIC8vICAgICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgLy8gICAgIH0pXHJcbiAgICBcclxuICAvLyB9XHJcblxyXG5cclxuXHJcbiAgLy8gUmVsb2FkSnNvbkZpbGUoKSB7XHJcbiAgLy8gICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLlJlbG9hZEpzb25GaWxlKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAvLyAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gIC8vICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gIC8vICAgICBlbGVtZW50LlVwZGF0ZVBhZ2luZygpO1xyXG4gIC8vICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gUmVzdFRvRmFjdG9yeURlZmF1bHQoKSB7XHJcbiAgLy8gIHRoaXMubG9jYWxpemF0aW9uc1NlcnZpY2UuUmVzdFRvRmFjdG9yeURlZmF1bHQoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gIC8vICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgLy8gICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgLy8gICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgLy8gICB9LCAoZXJyb3IpID0+IHtcclxuICAgICBcclxuICAvLyAgIH0pXHJcbiAgLy8gfVxyXG5cclxuICAvLyBSZXN0VW5tb2RpZmllZFRvRmFjdG9yeURlZmF1bHQoKSB7XHJcbiAgLy8gICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLlJlc3RVbm1vZGlmaWVkVG9GYWN0b3J5RGVmYXVsdCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgLy8gICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgLy8gICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgLy8gICB9LCAoZXJyb3IpID0+IHtcclxuICAgICBcclxuICAvLyAgIH0pXHJcbiAgLy8gfVxyXG5cclxuXHJcbiBcclxuXHJcblxyXG4gIC8vLy8vLy8vLy8vLy8gU3RhcnQgVXBsb2FkIFJlc291cmNlIFBhcnQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgc2hvd1VwbG9hZE1vZGFsKHVwbG9hZFJlc291cmNlTW9kYWwpIHtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJKCk7XHJcbiAgICB0aGlzLnVwbG9hZEpzb25GaWxlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIHRoaXMudXBsb2FkSnNvbkZpbGVGb3JtT3B0aW9ucyA9IG5ldyBGb3JtT3B0aW9ucygpO1xyXG4gICAgdGhpcy51cGxvYWRKc29uRmlsZUZvcm1PcHRpb25zLkZvcm1Hcm91cCA9IHRoaXMudXBsb2FkSnNvbkZpbGVGb3JtXHJcbiAgICB0aGlzLnVwbG9hZEpzb25GaWxlRm9ybU9wdGlvbnMuR2V0TW9kZWxGdW5jdGlvbiA9IHRoaXMuZ2V0VXBsb2FkTW9kYWw7XHJcbiAgICB0aGlzLnVwbG9hZEpzb25GaWxlRm9ybU9wdGlvbnMuU2VydmljZVN1Ym1pdEZ1bmN0aW9uID0gdGhpcy5nZXRVcGxvYWRGdW5jdGlvbjtcclxuICAgIHRoaXMudXBsb2FkSnNvbkZpbGVGb3JtT3B0aW9ucy5PblN1Y2Nlc3NIYW5kbGVyID0gdGhpcy5vblN1Y2Nlc3NIYW5kbGVyO1xyXG4gICAgdGhpcy51cGxvYWRKc29uRmlsZUZvcm1PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudFxyXG4gICBcclxuICAgIHRoaXMudXBsb2FkUmVzb3VyY2VTZXRPcHRpb25zID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgdGhpcy51cGxvYWRSZXNvdXJjZVNldE9wdGlvbnMuTmFtZSA9IFwiU2VsZWN0ZWRSZXNvdXJjZVNldFwiXHJcbiAgICB0aGlzLnVwbG9hZFJlc291cmNlU2V0T3B0aW9ucy5MYWJlbEtleSA9IFwiUmVzb3VyY2VTZXRcIlxyXG4gICAgdGhpcy51cGxvYWRSZXNvdXJjZVNldE9wdGlvbnMuRGF0YVNvdXJjZSA9IHRoaXMucmVzb3VyY2VTZXRMaXN0XHJcbiAgICB0aGlzLnVwbG9hZFJlc291cmNlU2V0T3B0aW9ucy5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy51cGxvYWRSZXNvdXJjZVNldE9wdGlvbnMuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy51cGxvYWRSZXNvdXJjZVNldE9wdGlvbnMuUGxhY2Vob2xkZXIgPSBcIlwiO1xyXG5cclxuXHJcbiAgICB0aGlzLnJlc291cmNlc0ZpbGVJbnB1dCA9IG5ldyBGaWxlVXBsb2FkT3B0aW9ucygpO1xyXG4gICAgdGhpcy5yZXNvdXJjZXNGaWxlSW5wdXQuTmFtZSA9IFwiUmVzb3VyY2VzRmlsZVwiXHJcbiAgICB0aGlzLnJlc291cmNlc0ZpbGVJbnB1dC5MYWJlbEtleSA9IFwiVXBsb2FkRmlsZVwiXHJcbiAgICB0aGlzLnJlc291cmNlc0ZpbGVJbnB1dC5Jc011bHRpcGxlRmlsZSA9IGZhbHNlXHJcbiAgICB0aGlzLnJlc291cmNlc0ZpbGVJbnB1dC5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzID0gW0ZpbGVUeXBlLkV4Y2VsXVxyXG4gICAgdGhpcy5yZXNvdXJjZXNGaWxlSW5wdXQuRmlsZU1heFNpemVJbk1CID0gMTA7XHJcbiAgICB0aGlzLnJlc291cmNlc0ZpbGVJbnB1dC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHVwbG9hZFJlc291cmNlTW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldFVwbG9hZE1vZGFsID0gKCkgPT4ge1xyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLnVwbG9hZEpzb25GaWxlRm9ybS52YWx1ZTtcclxuICAgIGxldCBSZXNvdXJjZU1vZGVsID0gbmV3IFVwbG9hZEpzb25WTSgpO1xyXG4gICAgUmVzb3VyY2VNb2RlbC5TZWxlY3RlZFJlc291cmNlU2V0ID0gUmVzdWx0TW9kZWwuU2VsZWN0ZWRSZXNvdXJjZVNldDtcclxuICAgIFJlc291cmNlTW9kZWwuUmVzb3VyY2VzRmlsZSA9IHtcclxuICAgIEZpbGVCYXNlNjQ6IFJlc3VsdE1vZGVsW1wiUmVzb3VyY2VzRmlsZVwiXS5GaWxlLkZpbGVCYXNlNjQsXHJcbiAgICBGaWxlTmFtZTogUmVzdWx0TW9kZWxbXCJSZXNvdXJjZXNGaWxlXCJdLkZpbGUuRmlsZU5hbWUsXHJcbiAgICBGaWxlU2l6ZUluTUI6IFJlc3VsdE1vZGVsW1wiUmVzb3VyY2VzRmlsZVwiXS5GaWxlLkZpbGVTaXplSW5NQixcclxuICAgIEZpbGVUeXBlOiBSZXN1bHRNb2RlbFtcIlJlc291cmNlc0ZpbGVcIl0uRmlsZS5GaWxlVHlwZVxyXG4gICAgICB9XHJcbiAgICBwYXJhbUFycmF5LnB1c2goUmVzb3VyY2VNb2RlbCk7XHJcbiAgICByZXR1cm4gcGFyYW1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldFVwbG9hZEZ1bmN0aW9uID0gKFJlc291cmNlTW9kZWwpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xyXG4gICAgcmV0dXJuICB0aGlzLmxvY2FsaXphdGlvbnNTZXJ2aWNlLnVwbG9hZEV4Y2VsRmlsZXMoUmVzb3VyY2VNb2RlbClcclxuICB9XHJcbiAgb25TdWNjZXNzSGFuZGxlcj0ocmVzdWx0KT0+e1xyXG4gICAgdGhpcy5leGNlbFZhbGlkYXRpb249cmVzdWx0LnZhbFxyXG4gICAgbGV0IHNob3dCdXR0b249IHRoaXMuU2hvd1Jlc291cmNlVmFsaWRhdGlvbk1vZGFsIGFzIGFueSBcclxuICAgIHNob3dCdXR0b24uY2xpY2soKVxyXG4gIH1cclxuICAvLy8vLy8vLy8vLy8gRW5kIG9mIFVwbG9hZCBSZXNvdXJjZSBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcblxyXG5cclxuICBvcGVuUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwoUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwpIHtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwpO1xyXG4gIH1cclxuICBjb25maXJtRXhjZWwoKXtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uubm90aWZ5U3VjY2Vzc01lc3NhZ2UoKVxyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLnBhZ2luZ0VsZW1lbnQgYXMgYW55O1xyXG4gICAgdGhpcy5pbml0aWFsaXplUGFnZSgpO1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgZmlsdGVyTG9jYWxpemF0aW9uTGlzdChzZWFyY2hWYWx1ZSl7XHJcbiAgICBpZihzZWFyY2hWYWx1ZSlcclxuICAgIHRoaXMuZmlsdGVyZWRMb2NhbGl6YXRpb25QYWdpbmdSZXN1bHQ9IHRoaXMubG9jYWxpemF0aW9uUGFnaW5nUmVzdWx0LmZpbHRlcihpdGVtID0+IGl0ZW0udmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICBlbHNlXHJcbiAgICB0aGlzLmZpbHRlcmVkTG9jYWxpemF0aW9uUGFnaW5nUmVzdWx0PSB0aGlzLmxvY2FsaXphdGlvblBhZ2luZ1Jlc3VsdFxyXG4gIH1cclxuXHJcbiAgLy8vLy8vLy8vLy9EZXN0cm95IE9ic2VydmFibGUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXF1ZXN0SGFuZGxlclNlcnZpY2UuZGVzdHJveUhhbmRsZXIoKTtcclxuICB9XHJcblxyXG5cclxufVxyXG4iLCI8YmxvY2stdWk+IDwvYmxvY2stdWk+XHJcbiAgPCEtLSBQYWdlIENvbnRlbnQgLS0+XHJcbiAgPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtY3VzdG9tLWhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiICpuZ0lmPVwiaXNGaWx0ZXJMb2FkZWRcIj5cclxuICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cInNlYXJjaFRleHRCb3hcIiAoT25DaGFuZ2UpPVwiZmlsdGVyTG9jYWxpemF0aW9uTGlzdCgkZXZlbnQpXCIgIFtncm91cF09XCJsb2NhbGl6YXRpb25Gb3JtXCI+PC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgIDwhLS0gYmVnaW46Ok1lbnUgLS0+XHJcblxyXG4gICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtaW5saW5lLWJsb2NrXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25Ub2dnbGUgaHJlZj1cImphdmFzY3JpcHQ6O1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0LXByaW1hcnkgbWUtM1wiIGlkPVwiRmlsdGVyc0Ryb3Bkb3duXCIgdGl0bGU9XCJGaWx0ZXJcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1maWx0ZXIgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJGaWx0ZXJcIil9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRmlsdGVyTG9hZGVkXCIgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cIkZpbHRlcnNEcm9wZG93blwiIGNsYXNzPVwiIGZpbHRlci1jb250YWluZXIgbWVudSBtZW51LXN1YiBtZW51LXN1Yi1kcm9wZG93biBtZW51LWNvbHVtbiBtZW51LXJvdW5kZWQgbWVudS1ncmF5LTgwMCBtZW51LXN0YXRlLWJnLWxpZ2h0LXByaW1hcnkgIHctMjUwcHggdy1tZC01MDBweCBmdy1ib2xkIHB5LTMgXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNyBweS01XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cInJlc291cmNlU2V0T3B0aW9uc1wiIFtncm91cF09XCJsb2NhbGl6YXRpb25Gb3JtXCI+PC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLWFjdGl2ZS1saWdodC1wcmltYXJ5IHB2LXJlc2V0IGJ0bi1zbVwiIGlkPVwiYXBwbHlGaWx0ZXJzQnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcnMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVzZXRcIil9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd0V4cG9ydEV4Y2VsTW9kYWwoKVwiXHJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQtcHJpbWFyeSBibnNpZ2h0cy1idG4tZXhwb3J0IG1lLTMgXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWRvd25sb2FkIG1lLTFcIj48L2k+XHJcbiAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkV4cG9ydFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuQWN0aXZhdGVcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodC1wcmltYXJ5IG1lLTMgXCIgKGNsaWNrKT1cInNob3dSZWxvYWRSZXNvdXJjZU1vZGFsKClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHQgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVsb2FkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG1lLTMgXCIgaWQ9XCJidG5BY3RpdmF0ZVwiIChjbGljayk9XCJzaG93VXBsb2FkTW9kYWwoVXBsb2FkSnNvbkZpbGVNb2RhbClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdXBsb2FkIG1lLTFcIj48L2k+XHJcbiAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlVwbG9hZFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBtZS0zXCIgKGNsaWNrKT1cInNob3dBZGRSZXNvdXJjZU1vZGFsKEFkZFJlc291cmNlTW9kYWwpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWRkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51dFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBtZS0zIGJ0bi1pY29uXCIgdGl0bGU9XCJvcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXJzXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51dD1cIm1hdE1lbnVcIiBjbGFzcz1cInB5LTNcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtZW51LWl0ZW0gcHgtM1wiIChjbGljayk9XCJzaG93UmVzdFRvRmFjdG9yeURlZmF1bHQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpbmsgcHgtM1wiPiAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVzdFRvRmFjdG9yeURlZmF1bHRcIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG5nYkRyb3Bkb3duSXRlbSAqbmdJZj1cIiFQcm9kdWN0aW9uTW9kZVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1lbnUtaXRlbSBweC0zXCIgKGNsaWNrKT1cImdlbmVyYXRlU3Ryb25nbHlUeXBlZENsYXNzKEdlbmVyYXRlU3Ryb25nbHlUeXBlZE1vZGFsKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpbmsgcHgtM1wiPiAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiR2VuZXJhdGVTdHJvbmdseVR5cGVkQ2xhc3NcIil9fSA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS0gZW5kOjpNZW51IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBlbmQ6OkhlYWRlciAtLT5cclxuICAgICAgPCEtLSBiZWdpbjo6Qm9keSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgIDwhLS0gYmVnaW46OlRhYmxlIC0tPlxyXG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYWxpZ24tbWlkZGxlIHRhYmxlLXJvdy1kYXNoZWQgZnMtNiBneS01IGRhdGFUYWJsZSBuby1mb290ZXJcIj5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtc3RhcnQgdGV4dC1ncmF5LTQwMCBmdy1ib2xkZXIgZnMtNyB0ZXh0LXVwcGVyY2FzZSBncy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc291cmNlSWRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc291cmNlU2V0XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJWYWx1ZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3Rpb25cIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGlkPVwibGlzdGluZ0NvbnRhaW5lclwiIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNjAwIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBMb2NhbGl6YXRpb24gb2YgZmlsdGVyZWRMb2NhbGl6YXRpb25QYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZGFya1wiPnt7TG9jYWxpemF0aW9uLnJlc291cmNlSWR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3tMb2NhbGl6YXRpb24ucmVzb3VyY2VTZXR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3tMb2NhbGl6YXRpb24udmFsdWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1saWdodCBidG4tYWN0aXZlLWxpZ2h0LXByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gY2xhc3M9XCJtZW51LWl0ZW0gcHgtM1wiIChjbGljayk9XCJzaG93RWRpdFJlc291cmNlTW9kYWwoTG9jYWxpemF0aW9uLEVkaXRSZXNvdXJjZU1vZGFsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnUtbGluayBweC0zXCI+ICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0XCIpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gKm5nSWY9XCIhUHJvZHVjdGlvbk1vZGVcIiBjbGFzcz1cIm1lbnUtaXRlbSBweC0zXCIgKGNsaWNrKT1cInNob3dEZWxldGVSZXNvdXJjZU1vZGFsKExvY2FsaXphdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZW51LWxpbmsgcHgtM1wiPiAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRGVsZXRlXCIpfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJmaWx0ZXJlZExvY2FsaXphdGlvblBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsaWItZW1wdHktZGF0YT48L2xpYi1lbXB0eS1kYXRhPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgIDwhLS1lbmQ6OnVzZXJzIGxpc3QtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0TG9jYWxpemF0aW9uTGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJpc0ZpbHRlckxvYWRlZFwiIFtvcHRpb25zXT1cImxvY2FsaXphdGlvblBhZ2luZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJsb2NhbGl6YXRpb25Gb3JtXCIgI0xvY2FsaXphdGlvblBhZ2luZ1ZpZXdFbGVtZW50PlxyXG4gICAgICAgIDwvQkJTRi1QYWdpbmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgPCEtLSBBZGQgTW9kYWwgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNBZGRSZXNvdXJjZU1vZGFsIGxldC1tb2RhbD5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgcGItMCBib3JkZXItMCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJleGFtcGxlTW9kYWxMYWJlbFwiPjwvaDU+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tYWN0aXZlLWNvbG9yLXByaW1hcnlcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTFcIj5cclxuICAgICAgICAgIDxzcGFuIFtpbmxpbmVTVkddPVwiJy4vc3JjL2Fzc2V0cy9pbWFnZXMvYXJyMDYxLnN2ZydcIj48L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgc2Nyb2xsLXkgcHgtMTAgcHgtbGctMTUgcHQtMCBwYi0xNVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICA8aDEgY2xhc3M9XCJtYi0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWRkUmVzb3VyY2VcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8QkJTRi1Gb3JtIFtvcHRpb25zXT1cImFkZFJlc291cmNlRm9ybU9wdGlvbnNcIj5cclxuICAgICAgICA8QkJTRi1BdXRvY29tcGxldGVUZXh0Qm94IFtvcHRpb25zXT1cInJlc291cmNlU2V0XCIgW2dyb3VwXT1cImFkZFJlc291cmNlRm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1BdXRvY29tcGxldGVUZXh0Qm94PlxyXG4gICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwicmVzb3VyY2VJZFwiIFtncm91cF09XCJhZGRSZXNvdXJjZUZvcm1cIj5cclxuICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICA8QkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYSBbb3B0aW9uc109XCJtdWx0aUxpbmd1YWxWYWx1ZVwiIFtncm91cF09XCJhZGRSZXNvdXJjZUZvcm1cIj48L0JCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWE+XHJcbiAgICAgICAgPEJCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWEgW29wdGlvbnNdPVwibXVsdGlMaW5ndWFsQ29tbWVudFwiIFtncm91cF09XCJhZGRSZXNvdXJjZUZvcm1cIj48L0JCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWE+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB0LTdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICNDbG9zZVJlc291cmNlTW9kYWwgaWQ9XCJDbG9zZVJlc291cmNlTW9kYWxcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBtZS0zIGJ0bi1zbVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDYW5jZWxMYWJlbFwiKX19IDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2F2ZUxhYmVsXCIpfX08L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9CQlNGLUZvcm0+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBFZGl0IE1vZGFsIC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjRWRpdFJlc291cmNlTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0UmVzb3VyY2VcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8QkJTRi1Gb3JtIFtvcHRpb25zXT1cImVkaXRSZXNvdXJjZUZvcm1PcHRpb25zXCI+XHJcbiAgICAgICAgPEJCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWEgW29wdGlvbnNdPVwiZWRpdE11bHRpTGluZ3VhbFZhbHVlXCIgW2dyb3VwXT1cImVkaXRSZXNvdXJjZUZvcm1cIj48L0JCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWE+XHJcbiAgICAgICAgPEJCU0YtTXVsdGlMaW5ndWFsVGV4dEFyZWEgW29wdGlvbnNdPVwiZWRpdE11bHRpTGluZ3VhbENvbW1lbnRcIiBbZ3JvdXBdPVwiZWRpdFJlc291cmNlRm9ybVwiPjwvQkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB0LTdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICNDbG9zZUVkaXRSZXNvdXJjZU1vZGFsIGlkPVwiQ2xvc2VFZGl0UmVzb3VyY2VNb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L0JCU0YtRm9ybT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8IS0tIFVwbG9hZCBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI1VwbG9hZEpzb25GaWxlTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJVcGxvYWRSZXNvdXJjZXNcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWNlIGQtZmxleCBiZy1saWdodC1wcmltYXJ5IHJvdW5kZWQgYm9yZGVyLXByaW1hcnkgYm9yZGVyIGJvcmRlci1kYXNoZWQgbWItMTAgcC02XCI+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpJY29uLS0+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpTdmcgSWNvbiB8IHBhdGg6IGljb25zL2R1b3R1bmUvZ2VuZXJhbC9nZW4wNDQuc3ZnLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0ydHggc3ZnLWljb24tcHJpbWFyeSBtZS00XCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2dlbjA0NC5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8IS0tZW5kOjpTdmcgSWNvbi0tPlxyXG4gICAgICAgIDwhLS1lbmQ6Okljb24tLT5cclxuICAgICAgICA8IS0tYmVnaW46OldyYXBwZXItLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtc3RhY2sgZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgIDwhLS1iZWdpbjo6Q29udGVudC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgdGV4dC1ncmF5LTcwMFwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlVwbG9hZEpzb25SZXNvdXJjZXNJbmZvXCIpfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwhLS1lbmQ6OkNvbnRlbnQtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tZW5kOjpXcmFwcGVyLS0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8QkJTRi1Gb3JtIFtvcHRpb25zXT1cInVwbG9hZEpzb25GaWxlRm9ybU9wdGlvbnNcIj5cclxuICAgICAgICA8YSBbaGlkZGVuXT1cInRydWVcIiBpZD1cIlNob3dSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbFwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwib3BlblJlc291cmNlVmFsaWRhdGlvbk1vZGFsKFJlc291cmNlVmFsaWRhdGlvbk1vZGFsKVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1oaXN0b3J5XCI+PC9pPiB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJzaG93XCIpfX1cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPEJCU0YtRmlsZVVwbGFvZCBbb3B0aW9uc109XCJyZXNvdXJjZXNGaWxlSW5wdXRcIiBbZ3JvdXBdPVwidXBsb2FkSnNvbkZpbGVGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLUZpbGVVcGxhb2Q+XHJcbiAgICAgICAgPGEgaWQ9XCJidG5EZWFjdGl2YXRlXCIgaHJlZj1cImphdmFzY3JpcHQ6O1wiIChjbGljayk9XCJzaG93RXhwb3J0RXhjZWxNb2RhbCh0cnVlKVwiPlxyXG4gICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRG93bmxvYWRSZXNvdXJjZVRlbXBsYXRlU2hlZXRcIil9fVxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlVXBsb2FkSnNvbkZpbGVNb2RhbCBpZD1cIkNsb3NlVXBsb2FkSnNvbkZpbGVNb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L0JCU0YtRm9ybT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcblxyXG4gIDwhLS0gR2VuZXJhdGVTdHJvbmdseVR5cGVkQ2xhc3MgIE1vZGFsIC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjR2VuZXJhdGVTdHJvbmdseVR5cGVkTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJHZW5lcmF0ZUNvZGVcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8QkJTRi1UZXh0QXJlYSBbb3B0aW9uc109XCJzdHJvbmdseVR5cGVkQ2xhc3NcIiBbZ3JvdXBdPVwiZ2VuZXJhdGVDb2RlRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLVRleHRBcmVhPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlU3Ryb25nbHlUeXBlZENsYXNzTW9kYWwgaWQ9XCJDbG9zZVN0cm9uZ2x5VHlwZWRDbGFzc01vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiIChjbGljayk9XCJjb3B5SW5wdXRNZXNzYWdlKClcIj5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ29weVRvQ2xpcGJvYXJkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48IS0tZGVsZXRlIE1vZGFsLS0+XHJcbjxCQlNGLUNvbmZpcm1hdGlvbk1vZGFsICpuZ0lmPVwiZGVsZXRlQ29udHJvbExvYWRlZFwiIFtvcHRpb25zXT1cImRlbGV0ZUNvbmZpcm1hdGlvbk9wdGlvbnNcIiBpZD1cIkNvbmZpcm1hdGlvbk1vZGFsQ29udHJvbFwiXHJcbiNDb25maXJtYXRpb25Nb2RhbENvbnRyb2w+PC9CQlNGLUNvbmZpcm1hdGlvbk1vZGFsPlxyXG5cclxuPCEtLUV4cG9ydCBNb2RhbC0tPlxyXG48QkJTRi1Db25maXJtYXRpb25Nb2RhbCAqbmdJZj1cImV4cG9ydENvbnRyb2xMb2FkZWRcIiBbb3B0aW9uc109XCJleHBvcnRDb25maXJtYXRpb25PcHRpb25zXCIgaWQ9XCJleHBvcnRDb25maXJtYXRpb25Db250cm9sXCJcclxuI2V4cG9ydENvbmZpcm1hdGlvbkNvbnRyb2w+PC9CQlNGLUNvbmZpcm1hdGlvbk1vZGFsPlxyXG5cclxuPCEtLVJlbG9hZCBNb2RhbC0tPlxyXG48QkJTRi1Db25maXJtYXRpb25Nb2RhbCAqbmdJZj1cInJlbG9hZENvbnRyb2xMb2FkZWRcIiBbb3B0aW9uc109XCJyZWxvYWRDb25maXJtYXRpb25PcHRpb25zXCIgaWQ9XCJSZWxvYWRDb25maXJtYXRpb25Nb2RhbENvbnRyb2xcIlxyXG4jUmVsb2FkQ29uZmlybWF0aW9uTW9kYWxDb250cm9sPjwvQkJTRi1Db25maXJtYXRpb25Nb2RhbD5cclxuXHJcbjwhLS1SZXN0IE1vZGFsLS0+XHJcbjxCQlNGLUNvbmZpcm1hdGlvbk1vZGFsICpuZ0lmPVwicmVzdFRvRmFjdG9yeURlZmF1bHRDb250cm9sTG9hZGVkXCIgW29wdGlvbnNdPVwicmVzdFRvRmFjdG9yeURlZmF1bHRDb25maXJtYXRpb25PcHRpb25zXCIgaWQ9XCJSZXN0Q29uZmlybWF0aW9uTW9kYWxDb250cm9sXCJcclxuI1Jlc3RDb25maXJtYXRpb25Nb2RhbENvbnRyb2w+PC9CQlNGLUNvbmZpcm1hdGlvbk1vZGFsPlxyXG5cclxuXHJcbiAgPCEtLSBSZXNvdXJjZSBWYWxpZGF0aW9uIE1vZGFsLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNSZXNvdXJjZVZhbGlkYXRpb25Nb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc291cmNlY2hlY2tSZXN1bHRcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWNlIGQtZmxleCBiZy1saWdodC13YXJuaW5nIHJvdW5kZWQgYm9yZGVyLXdhcm5pbmcgYm9yZGVyIGJvcmRlci1kYXNoZWQgbWItMTAgcC02XCI+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpJY29uLS0+XHJcbiAgICAgICAgPCEtLWJlZ2luOjpTdmcgSWNvbiB8IHBhdGg6IGljb25zL2R1b3R1bmUvZ2VuZXJhbC9nZW4wNDQuc3ZnLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0ydHggc3ZnLWljb24td2FybmluZyBtZS00XCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2dlbjA0NC5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8IS0tZW5kOjpTdmcgSWNvbi0tPlxyXG4gICAgICAgIDwhLS1lbmQ6Okljb24tLT5cclxuICAgICAgICA8IS0tYmVnaW46OldyYXBwZXItLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtc3RhY2sgZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgIDwhLS1iZWdpbjo6Q29udGVudC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgdGV4dC1ncmF5LTcwMFwiICpuZ0lmPVwiIWV4Y2VsVmFsaWRhdGlvbi5pc1ZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlVwZGF0ZWRFbnRyaWVzTnVtYmVyXCIpfX0ge3tleGNlbFZhbGlkYXRpb24udmFsaWRDb3VudH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkludmFsaWRFbnRyaWVzTnVtYmVyXCIpfX0ge3tleGNlbFZhbGlkYXRpb24uaW52YWxpZENvdW50fX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy02IHRleHQtZ3JheS03MDBcIiAqbmdJZj1cImV4Y2VsVmFsaWRhdGlvbi5pc1ZhbGlkXCI+XHJcbiAgICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWxsRW50cmllc1ZhbGlkXCIpfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8IS0tZW5kOjpDb250ZW50LS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLWVuZDo6V3JhcHBlci0tPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFleGNlbFZhbGlkYXRpb24uaXNWYWxpZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICA8IS0tIGJlZ2luOjpUYWJsZSAtLT5cclxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUmVzb3VyY2VJZFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlJlc291cmNlU2V0XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXJyb3JNZXNzYWdlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cInRySXRlbVwiICpuZ0Zvcj1cImxldCBMb2NhbGl6YXRpb24gb2YgZXhjZWxWYWxpZGF0aW9uLmludmFsaWRFbnRyaWVzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAge3tMb2NhbGl6YXRpb24ucmVzb3VyY2VJZH19XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7TG9jYWxpemF0aW9uLnJlc291cmNlU2V0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7TG9jYWxpemF0aW9uLmVycm9yTWVzc2FnZX19PC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlUmVzb3VyY2VWYWxpZGF0aW9uTW9kYWwgaWQ9XCJDbG9zZVJlc291cmNlVmFsaWRhdGlvbk1vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY29uZmlybUV4Y2VsKClcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuIl19
|