@bnsights/bbsf-controls 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/bnsights-bbsf-controls.d.ts +26 -0
- package/bnsights-bbsf-controls.metadata.json +1 -0
- package/bundles/bnsights-bbsf-controls.umd.js +6375 -0
- package/bundles/bnsights-bbsf-controls.umd.js.map +1 -0
- package/esm2015/bnsights-bbsf-controls.js +27 -0
- package/esm2015/lib/Shared/Enums/CalendarView.js +8 -0
- package/esm2015/lib/Shared/Enums/ControlLayout.js +6 -0
- package/esm2015/lib/Shared/Enums/Countries.js +247 -0
- package/esm2015/lib/Shared/Enums/FileType.js +22 -0
- package/esm2015/lib/Shared/Enums/FilterType.js +11 -0
- package/esm2015/lib/Shared/Enums/FontSize.js +7 -0
- package/esm2015/lib/Shared/Enums/ForceDirection.js +6 -0
- package/esm2015/lib/Shared/Enums/IconPosition.js +6 -0
- package/esm2015/lib/Shared/Enums/ImageType.js +10 -0
- package/esm2015/lib/Shared/Enums/InputType.js +9 -0
- package/esm2015/lib/Shared/Enums/Insert.js +9 -0
- package/esm2015/lib/Shared/Enums/LanguageMode.js +11 -0
- package/esm2015/lib/Shared/Enums/Misc.js +7 -0
- package/esm2015/lib/Shared/Enums/PagingActionMode.js +6 -0
- package/esm2015/lib/Shared/Enums/Para.js +9 -0
- package/esm2015/lib/Shared/Enums/PickerType.js +7 -0
- package/esm2015/lib/Shared/Enums/SelectMode.js +6 -0
- package/esm2015/lib/Shared/Enums/StartView.js +7 -0
- package/esm2015/lib/Shared/Enums/Style.js +8 -0
- package/esm2015/lib/Shared/Enums/menu-list-enum.js +6 -0
- package/esm2015/lib/Shared/Models/Attribute.js +3 -0
- package/esm2015/lib/Shared/Models/AutocompleteDTO.js +7 -0
- package/esm2015/lib/Shared/Models/AutocompleteOptions.js +29 -0
- package/esm2015/lib/Shared/Models/CalendarEventDTO.js +3 -0
- package/esm2015/lib/Shared/Models/CalendarOptions.js +17 -0
- package/esm2015/lib/Shared/Models/CancelDTO.js +7 -0
- package/esm2015/lib/Shared/Models/CheckBoxOptions.js +12 -0
- package/esm2015/lib/Shared/Models/CustomValidation.js +14 -0
- package/esm2015/lib/Shared/Models/DropdownListItem.js +3 -0
- package/esm2015/lib/Shared/Models/DropdownOptions.js +18 -0
- package/esm2015/lib/Shared/Models/EditPersonalImage.js +7 -0
- package/esm2015/lib/Shared/Models/EnglishArabicDTO.js +3 -0
- package/esm2015/lib/Shared/Models/FileDTO.js +2 -0
- package/esm2015/lib/Shared/Models/FileUploadModel.js +3 -0
- package/esm2015/lib/Shared/Models/FileUploadOptions.js +15 -0
- package/esm2015/lib/Shared/Models/FilterItem.js +8 -0
- package/esm2015/lib/Shared/Models/FormOptions.js +26 -0
- package/esm2015/lib/Shared/Models/HtmlEditorOptions.js +16 -0
- package/esm2015/lib/Shared/Models/ImageUploadOptions.js +18 -0
- package/esm2015/lib/Shared/Models/MapAutoCompleteOptions.js +11 -0
- package/esm2015/lib/Shared/Models/MapAutocompleteDTO.js +3 -0
- package/esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js +19 -0
- package/esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js +19 -0
- package/esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js +22 -0
- package/esm2015/lib/Shared/Models/MultipleFileUploadModel.js +9 -0
- package/esm2015/lib/Shared/Models/PagingDTO.js +13 -0
- package/esm2015/lib/Shared/Models/PagingOptions.js +43 -0
- package/esm2015/lib/Shared/Models/PhoneOptions.js +15 -0
- package/esm2015/lib/Shared/Models/ProfileImageUploadOptions.js +15 -0
- package/esm2015/lib/Shared/Models/ProfilePictureDTO.js +3 -0
- package/esm2015/lib/Shared/Models/RadioButtonItem.js +3 -0
- package/esm2015/lib/Shared/Models/RadioButtonOptions.js +10 -0
- package/esm2015/lib/Shared/Models/RangeNumber.js +3 -0
- package/esm2015/lib/Shared/Models/SaveDTO.js +7 -0
- package/esm2015/lib/Shared/Models/TagsInputDTO.js +3 -0
- package/esm2015/lib/Shared/Models/TagsInputOptions.js +45 -0
- package/esm2015/lib/Shared/Models/TextAreaOptions.js +14 -0
- package/esm2015/lib/Shared/Models/TextBoxOptions.js +21 -0
- package/esm2015/lib/Shared/Models/ToggleslideOptions.js +9 -0
- package/esm2015/lib/Shared/Models/UploadPersonalImage.js +7 -0
- package/esm2015/lib/Shared/Models/datePickerOptions.js +24 -0
- package/esm2015/lib/Shared/config/environment.js +12 -0
- package/esm2015/lib/Shared/services/ControlUtility.js +114 -0
- package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +22 -0
- package/esm2015/lib/Shared/services/validationErrorMassage.service.js +122 -0
- package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +236 -0
- package/esm2015/lib/controls/Calendar/Calendar.component.js +176 -0
- package/esm2015/lib/controls/CheckBox/CheckBox.component.js +111 -0
- package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +148 -0
- package/esm2015/lib/controls/DropdownList/DropdownList.component.js +172 -0
- package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +319 -0
- package/esm2015/lib/controls/Form/Form.component.js +82 -0
- package/esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js +202 -0
- package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +304 -0
- package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +283 -0
- package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +383 -0
- package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +325 -0
- package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +326 -0
- package/esm2015/lib/controls/Paging/JwPagination.component.js +127 -0
- package/esm2015/lib/controls/Paging/Paging.component.js +215 -0
- package/esm2015/lib/controls/Phone/Phone.component.js +114 -0
- package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +326 -0
- package/esm2015/lib/controls/RadioButton/RadioButton.component.js +98 -0
- package/esm2015/lib/controls/TagsInput/TagsInput.component.js +205 -0
- package/esm2015/lib/controls/TextArea/TextArea.component.js +148 -0
- package/esm2015/lib/controls/TextBox/TextBox.component.js +217 -0
- package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +71 -0
- package/esm2015/lib/controls/bbsf-controls.module.js +208 -0
- package/esm2015/public-api.js +101 -0
- package/fesm2015/bnsights-bbsf-controls.js +5794 -0
- package/fesm2015/bnsights-bbsf-controls.js.map +1 -0
- package/lib/Shared/Enums/CalendarView.d.ts +6 -0
- package/lib/Shared/Enums/ControlLayout.d.ts +4 -0
- package/lib/Shared/Enums/Countries.d.ts +245 -0
- package/lib/Shared/Enums/FileType.d.ts +20 -0
- package/lib/Shared/Enums/FilterType.d.ts +9 -0
- package/lib/Shared/Enums/FontSize.d.ts +5 -0
- package/lib/Shared/Enums/ForceDirection.d.ts +4 -0
- package/lib/Shared/Enums/IconPosition.d.ts +4 -0
- package/lib/Shared/Enums/ImageType.d.ts +8 -0
- package/lib/Shared/Enums/InputType.d.ts +7 -0
- package/lib/Shared/Enums/Insert.d.ts +7 -0
- package/lib/Shared/Enums/LanguageMode.d.ts +9 -0
- package/lib/Shared/Enums/Misc.d.ts +5 -0
- package/lib/Shared/Enums/PagingActionMode.d.ts +4 -0
- package/lib/Shared/Enums/Para.d.ts +7 -0
- package/lib/Shared/Enums/PickerType.d.ts +5 -0
- package/lib/Shared/Enums/SelectMode.d.ts +4 -0
- package/lib/Shared/Enums/StartView.d.ts +5 -0
- package/lib/Shared/Enums/Style.d.ts +6 -0
- package/lib/Shared/Enums/menu-list-enum.d.ts +4 -0
- package/lib/Shared/Models/Attribute.d.ts +4 -0
- package/lib/Shared/Models/AutocompleteDTO.d.ts +4 -0
- package/lib/Shared/Models/AutocompleteOptions.d.ts +74 -0
- package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -0
- package/lib/Shared/Models/CalendarOptions.d.ts +29 -0
- package/lib/Shared/Models/CancelDTO.d.ts +5 -0
- package/lib/Shared/Models/CheckBoxOptions.d.ts +38 -0
- package/lib/Shared/Models/CustomValidation.d.ts +10 -0
- package/lib/Shared/Models/DropdownListItem.d.ts +4 -0
- package/lib/Shared/Models/DropdownOptions.d.ts +67 -0
- package/lib/Shared/Models/EditPersonalImage.d.ts +5 -0
- package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -0
- package/lib/Shared/Models/FileDTO.d.ts +19 -0
- package/lib/Shared/Models/FileUploadModel.d.ts +4 -0
- package/lib/Shared/Models/FileUploadOptions.d.ts +56 -0
- package/lib/Shared/Models/FilterItem.d.ts +13 -0
- package/lib/Shared/Models/FormOptions.d.ts +15 -0
- package/lib/Shared/Models/HtmlEditorOptions.d.ts +66 -0
- package/lib/Shared/Models/ImageUploadOptions.d.ts +59 -0
- package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +44 -0
- package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -0
- package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +97 -0
- package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +85 -0
- package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +83 -0
- package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -0
- package/lib/Shared/Models/PagingDTO.d.ts +11 -0
- package/lib/Shared/Models/PagingOptions.d.ts +51 -0
- package/lib/Shared/Models/PhoneOptions.d.ts +56 -0
- package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +64 -0
- package/lib/Shared/Models/ProfilePictureDTO.d.ts +12 -0
- package/lib/Shared/Models/RadioButtonItem.d.ts +4 -0
- package/lib/Shared/Models/RadioButtonOptions.d.ts +44 -0
- package/lib/Shared/Models/RangeNumber.d.ts +4 -0
- package/lib/Shared/Models/SaveDTO.d.ts +5 -0
- package/lib/Shared/Models/TagsInputDTO.d.ts +4 -0
- package/lib/Shared/Models/TagsInputOptions.d.ts +91 -0
- package/lib/Shared/Models/TextAreaOptions.d.ts +60 -0
- package/lib/Shared/Models/TextBoxOptions.d.ts +70 -0
- package/lib/Shared/Models/ToggleslideOptions.d.ts +36 -0
- package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -0
- package/lib/Shared/Models/datePickerOptions.d.ts +65 -0
- package/lib/Shared/config/environment.d.ts +1 -0
- package/lib/Shared/services/ControlUtility.d.ts +23 -0
- package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +7 -0
- package/lib/Shared/services/validationErrorMassage.service.d.ts +13 -0
- package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +51 -0
- package/lib/controls/Calendar/Calendar.component.d.ts +40 -0
- package/lib/controls/CheckBox/CheckBox.component.d.ts +33 -0
- package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +41 -0
- package/lib/controls/DropdownList/DropdownList.component.d.ts +47 -0
- package/lib/controls/FileUplaod/FileUplaod.component.d.ts +49 -0
- package/lib/controls/Form/Form.component.d.ts +15 -0
- package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +44 -0
- package/lib/controls/ImageUpload/ImageUpload.component.d.ts +64 -0
- package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +52 -0
- package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +58 -0
- package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +59 -0
- package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +57 -0
- package/lib/controls/Paging/JwPagination.component.d.ts +24 -0
- package/lib/controls/Paging/Paging.component.d.ts +44 -0
- package/lib/controls/Phone/Phone.component.d.ts +37 -0
- package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +65 -0
- package/lib/controls/RadioButton/RadioButton.component.d.ts +31 -0
- package/lib/controls/TagsInput/TagsInput.component.d.ts +47 -0
- package/lib/controls/TextArea/TextArea.component.d.ts +41 -0
- package/lib/controls/TextBox/TextBox.component.d.ts +50 -0
- package/lib/controls/Toggleslide/toggleslide.component.d.ts +26 -0
- package/lib/controls/bbsf-controls.module.d.ts +10 -0
- package/package.json +85 -0
- package/public-api.d.ts +66 -0
- package/src/lib/assets/Style.css +1149 -0
- package/src/lib/assets/i18n/ar.json +29 -0
- package/src/lib/assets/i18n/en.json +24 -0
- package/src/lib/assets/images/imagenotfound.png +0 -0
- package/src/lib/assets/images/uploadimg.png +0 -0
- package/src/lib/assets/images/userimg.png +0 -0
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component, Input, Optional, Output, EventEmitter } from '@angular/core';
|
|
3
|
+
import { FormControl, Validators, FormGroup, ControlContainer, FormGroupDirective } from '@angular/forms';
|
|
4
|
+
import { ErrorMassageValidation } from '../../Shared/services/validationErrorMassage.service';
|
|
5
|
+
import { InputType } from '../../Shared/Enums/InputType';
|
|
6
|
+
import { EnglishArabicDTO } from '../../Shared/Models/EnglishArabicDTO';
|
|
7
|
+
import { ControlUtility } from '../../Shared/services/ControlUtility';
|
|
8
|
+
import { LanguageMode } from '../../Shared/Enums/LanguageMode';
|
|
9
|
+
import { BBSFTranslateService, ControlValidationService, UtilityService } from '@bnsights/bbsf-utilities';
|
|
10
|
+
export class MultiLingualTextAreaComponent {
|
|
11
|
+
constructor(ErrorHandler, MultiLingualTextAreaFormControlHost, controlContainer, controlUtility, UtilityService, translate, controlValidationService) {
|
|
12
|
+
this.ErrorHandler = ErrorHandler;
|
|
13
|
+
this.MultiLingualTextAreaFormControlHost = MultiLingualTextAreaFormControlHost;
|
|
14
|
+
this.controlContainer = controlContainer;
|
|
15
|
+
this.controlUtility = controlUtility;
|
|
16
|
+
this.UtilityService = UtilityService;
|
|
17
|
+
this.translate = translate;
|
|
18
|
+
this.controlValidationService = controlValidationService;
|
|
19
|
+
this.OnChange = new EventEmitter();
|
|
20
|
+
this.ArabicWordCount = 0;
|
|
21
|
+
this.ArabicWordCountArray = 0;
|
|
22
|
+
this.EnglishWordCount = 0;
|
|
23
|
+
this.EnglishWordCountArray = 0;
|
|
24
|
+
this.CurrentLanguage = "";
|
|
25
|
+
this.ArabicValidationRules = [];
|
|
26
|
+
this.ArabicValidationRulesasync = [];
|
|
27
|
+
this.EnglishValidationRules = [];
|
|
28
|
+
this.EnglishValidationRulesasync = [];
|
|
29
|
+
this.validationRules = [];
|
|
30
|
+
this.validationRulesasync = [];
|
|
31
|
+
this.IsShowArabicWordCount = false;
|
|
32
|
+
this.IsShowEnglishWordCount = false;
|
|
33
|
+
this.markAllAsTouched = false;
|
|
34
|
+
this.ArabicLetterOnly = "";
|
|
35
|
+
this.EnglishLetterOnly = "";
|
|
36
|
+
this.resetError = () => {
|
|
37
|
+
this.controlValidationService.RemoveGlobalError();
|
|
38
|
+
};
|
|
39
|
+
//External Method
|
|
40
|
+
this.RemoveRequiredValidation = () => {
|
|
41
|
+
this.controlUtility.RemoveRequiredValidation(this.EnglishTextAreaFormControl, this.EnglishValidationRules, this.options);
|
|
42
|
+
this.controlUtility.RemoveRequiredValidation(this.ArabicTextAreaFormControl, this.ArabicValidationRules, this.options);
|
|
43
|
+
};
|
|
44
|
+
//External Method
|
|
45
|
+
this.AddRequiredValidation = () => {
|
|
46
|
+
this.controlUtility.AddRequiredValidation(this.EnglishTextAreaFormControl, this.EnglishValidationRules, this.options);
|
|
47
|
+
this.controlUtility.AddRequiredValidation(this.ArabicTextAreaFormControl, this.ArabicValidationRules, this.options);
|
|
48
|
+
};
|
|
49
|
+
//External Method
|
|
50
|
+
this.RemoveCustomValidation = (CustomValidation) => {
|
|
51
|
+
this.controlUtility.RemoveCustomValidation(this.EnglishTextAreaFormControl, this.EnglishValidationRules, CustomValidation);
|
|
52
|
+
this.controlUtility.RemoveCustomValidation(this.ArabicTextAreaFormControl, this.ArabicValidationRules, CustomValidation);
|
|
53
|
+
};
|
|
54
|
+
//External Method
|
|
55
|
+
this.AddCustomValidation = (CustomValidation) => {
|
|
56
|
+
this.controlUtility.AddCustomValidation(this.EnglishTextAreaFormControl, this.EnglishValidationRules, CustomValidation);
|
|
57
|
+
this.controlUtility.AddCustomValidation(this.ArabicTextAreaFormControl, this.ArabicValidationRules, CustomValidation);
|
|
58
|
+
};
|
|
59
|
+
//External Method
|
|
60
|
+
this.IsValid = () => {
|
|
61
|
+
this.controlUtility.IsValid(this.EnglishTextAreaFormControl);
|
|
62
|
+
this.controlUtility.IsValid(this.ArabicTextAreaFormControl);
|
|
63
|
+
};
|
|
64
|
+
MultiLingualTextAreaComponent.controlContainerstatic = this.controlContainer;
|
|
65
|
+
}
|
|
66
|
+
getCustomErrorsMassages() {
|
|
67
|
+
this.ArabicLetterOnly = this.UtilityService.getResourceValue("ArabicLetterOnly");
|
|
68
|
+
this.EnglishLetterOnly = this.UtilityService.getResourceValue("EnglishLetterOnly");
|
|
69
|
+
}
|
|
70
|
+
ngOnInit() {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
this.controlValidationService.isCreatedBefor = false;
|
|
73
|
+
this.CurrentLanguage = yield this.UtilityService.getCurrentLanguage();
|
|
74
|
+
// UtilityService.Translator.onLangChange.subscribe((event: LangChangeEvent) => {
|
|
75
|
+
// this.CurrentLanguage = event.lang
|
|
76
|
+
// this.showInputUsingLanguageMode();
|
|
77
|
+
// });
|
|
78
|
+
if (this.options.ArabicLabelKey != null && this.options.ArabicLabelKey != "")
|
|
79
|
+
this.options.ArabicLabelValue = this.UtilityService.getResourceValue(this.options.ArabicLabelKey);
|
|
80
|
+
if (this.options.EnglishLabelKey != null && this.options.EnglishLabelKey != "")
|
|
81
|
+
this.options.EnglishLabelValue = this.UtilityService.getResourceValue(this.options.EnglishLabelKey);
|
|
82
|
+
this.MultiLanguageTextAreagroup = new FormGroup({});
|
|
83
|
+
this.MultiLanguageTextAreagroup.addControl("ArabicTextAreaValue", new FormControl(''));
|
|
84
|
+
this.MultiLanguageTextAreagroup.addControl("EnglishTextAreaValue", new FormControl(''));
|
|
85
|
+
this.ArabicTextAreaFormControl = this.MultiLanguageTextAreagroup.controls["ArabicTextAreaValue"]; // new FormControl('',validationRules);
|
|
86
|
+
this.EnglishTextAreaFormControl = this.MultiLanguageTextAreagroup.controls["EnglishTextAreaValue"]; // new FormControl('',validationRules);
|
|
87
|
+
this.group.addControl(this.options.Name, new FormGroup(this.MultiLanguageTextAreagroup.controls));
|
|
88
|
+
this.getCustomErrorsMassages();
|
|
89
|
+
switch (this.options.Type) {
|
|
90
|
+
case InputType.Email:
|
|
91
|
+
this.EnglishValidationRules.push(Validators.compose([
|
|
92
|
+
this.controlUtility.patternValidator(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/, { EmailValidationKey: "" }),
|
|
93
|
+
]));
|
|
94
|
+
this.ArabicValidationRules.push(Validators.compose([
|
|
95
|
+
this.controlUtility.patternValidator(/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/, { EmailValidationKey: "" }),
|
|
96
|
+
]));
|
|
97
|
+
break;
|
|
98
|
+
case InputType.Number:
|
|
99
|
+
this.EnglishValidationRules.push(Validators.pattern('^[0-9]+(\.?[0-9]+)?$'));
|
|
100
|
+
this.ArabicValidationRules.push(Validators.pattern('^[0-9]+(\.?[0-9]+)?$'));
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
if (this.options.CustomValidation.length > 0) {
|
|
104
|
+
let Validations = this.options.CustomValidation;
|
|
105
|
+
for (let index = 0; index < Validations.length; index++) {
|
|
106
|
+
const Validation = Validations[index];
|
|
107
|
+
this.EnglishValidationRules.push(Validation.functionBody);
|
|
108
|
+
this.ArabicValidationRules.push(Validation.functionBody);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (this.options.MinLength > 0) {
|
|
112
|
+
this.ArabicValidationRules.push(Validators.minLength(this.options.MinLength));
|
|
113
|
+
this.EnglishValidationRules.push(Validators.minLength(this.options.MinLength));
|
|
114
|
+
}
|
|
115
|
+
if (this.options.MaxLength > 0) {
|
|
116
|
+
this.EnglishValidationRules.push(Validators.maxLength(this.options.MaxLength));
|
|
117
|
+
this.ArabicValidationRules.push(Validators.maxLength(this.options.MaxLength));
|
|
118
|
+
}
|
|
119
|
+
this.showInputUsingLanguageMode();
|
|
120
|
+
this.ArabicValidationRules.push(Validators.compose([
|
|
121
|
+
this.controlUtility.patternValidator(/[\u0621-\u064A]+/, { ArabicLetterOnly: this.ArabicLetterOnly }),
|
|
122
|
+
]));
|
|
123
|
+
this.EnglishValidationRules.push(Validators.compose([
|
|
124
|
+
this.controlUtility.patternValidator(/^[\x00-\x7F]*$/, { EnglishLetterOnly: this.EnglishLetterOnly }),
|
|
125
|
+
]));
|
|
126
|
+
this.ArabicTextAreaFormControl.setValidators(this.ArabicValidationRules);
|
|
127
|
+
this.ArabicTextAreaFormControl.setAsyncValidators(this.ArabicValidationRulesasync);
|
|
128
|
+
this.EnglishTextAreaFormControl.setValidators(this.EnglishValidationRules);
|
|
129
|
+
this.EnglishTextAreaFormControl.setAsyncValidators(this.EnglishValidationRulesasync);
|
|
130
|
+
if (this.options.IsDisabled) {
|
|
131
|
+
this.EnglishTextAreaFormControl.disable();
|
|
132
|
+
this.ArabicTextAreaFormControl.disable();
|
|
133
|
+
}
|
|
134
|
+
this.ArabicTextAreaFormControl.setValue(this.options.Value.Arabic);
|
|
135
|
+
this.EnglishTextAreaFormControl.setValue(this.options.Value.English);
|
|
136
|
+
this.MultiLingualTextAreaFormControlHost.ngSubmit.subscribe((value) => {
|
|
137
|
+
this.group.markAllAsTouched();
|
|
138
|
+
this.markAllAsTouched = true;
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
onTextChange() {
|
|
143
|
+
let arabicValue = "";
|
|
144
|
+
let englishValue = "";
|
|
145
|
+
if (this.EnglishTextAreaFormControl.value == "") {
|
|
146
|
+
this.EnglishWordCountArray = 0;
|
|
147
|
+
this.EnglishWordCount = 0;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
if (this.EnglishTextAreaFormControl.value != null || this.EnglishTextAreaFormControl.value != undefined) {
|
|
151
|
+
this.EnglishWordCountArray = this.EnglishTextAreaFormControl.value.split(" ").length;
|
|
152
|
+
if (this.EnglishWordCountArray > 0) {
|
|
153
|
+
if (this.EnglishWordCountArray > this.options.MaxWordCount) {
|
|
154
|
+
this.EnglishWordCount = this.options.MaxWordCount;
|
|
155
|
+
this.MultiLanguageTextAreagroup.controls["EnglishTextAreaValue"].setErrors({ MaxWordCountValidationKey: this.options.MaxWordCount });
|
|
156
|
+
this.MultiLanguageTextAreagroup.controls["EnglishTextAreaValue"].markAsTouched();
|
|
157
|
+
this.MultiLanguageTextAreagroup.controls["EnglishTextAreaValue"].invalid;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.EnglishWordCount = this.EnglishWordCountArray;
|
|
161
|
+
}
|
|
162
|
+
englishValue = this.EnglishTextAreaFormControl.value;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (this.ArabicTextAreaFormControl.value == "") {
|
|
167
|
+
this.ArabicWordCountArray = 0;
|
|
168
|
+
this.ArabicWordCount = 0;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
if (this.ArabicTextAreaFormControl.value != null || this.ArabicTextAreaFormControl.value != undefined) {
|
|
172
|
+
this.ArabicWordCountArray = this.ArabicTextAreaFormControl.value.split(" ").length;
|
|
173
|
+
if (this.ArabicWordCountArray > 0) {
|
|
174
|
+
if (this.ArabicWordCountArray > this.options.MaxWordCount) {
|
|
175
|
+
this.ArabicWordCount = this.options.MaxWordCount;
|
|
176
|
+
this.MultiLanguageTextAreagroup.controls["ArabicTextAreaValue"].setErrors({ MaxWordCountValidationKey: this.options.MaxWordCount });
|
|
177
|
+
this.MultiLanguageTextAreagroup.controls["ArabicTextAreaValue"].markAsTouched();
|
|
178
|
+
this.MultiLanguageTextAreagroup.controls["ArabicTextAreaValue"].invalid;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
this.ArabicWordCount = this.ArabicWordCountArray;
|
|
182
|
+
}
|
|
183
|
+
arabicValue = this.ArabicTextAreaFormControl.value;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
let mulitLangModel = new EnglishArabicDTO();
|
|
188
|
+
mulitLangModel.Arabic = arabicValue;
|
|
189
|
+
mulitLangModel.English = englishValue;
|
|
190
|
+
this.OnChange.emit(mulitLangModel);
|
|
191
|
+
this.group.get(this.options.Name).setValue(mulitLangModel);
|
|
192
|
+
}
|
|
193
|
+
showGlobalError() {
|
|
194
|
+
this.controlUtility.showGlobalError();
|
|
195
|
+
}
|
|
196
|
+
getErrorValidation(ErrorList) {
|
|
197
|
+
if (this.markAllAsTouched && this.group.invalid) {
|
|
198
|
+
this.showGlobalError();
|
|
199
|
+
this.markAllAsTouched = false;
|
|
200
|
+
}
|
|
201
|
+
return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
|
|
202
|
+
}
|
|
203
|
+
getInputType(type) {
|
|
204
|
+
return InputType[type];
|
|
205
|
+
}
|
|
206
|
+
trimControlValue(type) {
|
|
207
|
+
const whitespace = ' ';
|
|
208
|
+
if (type == "En") {
|
|
209
|
+
if (this.EnglishTextAreaFormControl.value.startsWith(whitespace) || this.EnglishTextAreaFormControl.value.endsWith(whitespace)) {
|
|
210
|
+
this.EnglishTextAreaFormControl.patchValue(this.EnglishTextAreaFormControl.value.trim());
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (type == "Ar") {
|
|
214
|
+
if (this.ArabicTextAreaFormControl.value.startsWith(whitespace) || this.ArabicTextAreaFormControl.value.endsWith(whitespace)) {
|
|
215
|
+
this.ArabicTextAreaFormControl.patchValue(this.ArabicTextAreaFormControl.value.trim());
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
copyInputMessage(inputElement) {
|
|
220
|
+
this.controlUtility.CopyInputMessage(inputElement);
|
|
221
|
+
}
|
|
222
|
+
showInputUsingLanguageMode() {
|
|
223
|
+
this.ArabicValidationRules = this.ArabicValidationRules.filter(item => item !== Validators.required);
|
|
224
|
+
this.EnglishValidationRules = this.EnglishValidationRules.filter(item => item !== Validators.required);
|
|
225
|
+
this.ArabicTextAreaFormControl.clearValidators();
|
|
226
|
+
this.EnglishTextAreaFormControl.clearValidators();
|
|
227
|
+
this.ArabicTextAreaFormControl.updateValueAndValidity();
|
|
228
|
+
this.EnglishTextAreaFormControl.updateValueAndValidity();
|
|
229
|
+
switch (this.options.LanguageMode) {
|
|
230
|
+
case LanguageMode.Both_Languages_are_visible:
|
|
231
|
+
this.ShowArabicTextArea = true;
|
|
232
|
+
this.ShowEngishTextArea = true;
|
|
233
|
+
if (this.options.IsRequired == true) {
|
|
234
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
235
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
236
|
+
}
|
|
237
|
+
break;
|
|
238
|
+
case LanguageMode.Arabic_Language_only_is_visible:
|
|
239
|
+
this.ShowArabicTextArea = true;
|
|
240
|
+
break;
|
|
241
|
+
case LanguageMode.English_Language_only_is_visible:
|
|
242
|
+
this.ShowEngishTextArea = true;
|
|
243
|
+
break;
|
|
244
|
+
case LanguageMode.Both_Languages_are_visible_but_only_current_language_is_required:
|
|
245
|
+
this.ShowArabicTextArea = true;
|
|
246
|
+
this.ShowEngishTextArea = true;
|
|
247
|
+
if (this.CurrentLanguage == 'ar') {
|
|
248
|
+
if (this.options.IsRequired == true) {
|
|
249
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (this.CurrentLanguage == 'en') {
|
|
253
|
+
if (this.options.IsRequired == true) {
|
|
254
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
break;
|
|
258
|
+
case LanguageMode.Both_Languages_but_only_Arabic_is_required:
|
|
259
|
+
this.ShowArabicTextArea = true;
|
|
260
|
+
this.ShowEngishTextArea = true;
|
|
261
|
+
if (this.options.IsRequired == true) {
|
|
262
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
263
|
+
}
|
|
264
|
+
break;
|
|
265
|
+
case LanguageMode.Both_Languages_but_only_English_is_required:
|
|
266
|
+
this.ShowArabicTextArea = true;
|
|
267
|
+
this.ShowEngishTextArea = true;
|
|
268
|
+
if (this.options.IsRequired == true) {
|
|
269
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
270
|
+
}
|
|
271
|
+
break;
|
|
272
|
+
case LanguageMode.Current_Language_only_is_visible_and_required:
|
|
273
|
+
if (this.CurrentLanguage == 'ar') {
|
|
274
|
+
this.ShowArabicTextArea = true;
|
|
275
|
+
this.ShowEngishTextArea = false;
|
|
276
|
+
if (this.options.IsRequired == true) {
|
|
277
|
+
this.ArabicValidationRules.push(Validators.required);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (this.CurrentLanguage == 'en') {
|
|
281
|
+
this.ShowArabicTextArea = false;
|
|
282
|
+
this.ShowEngishTextArea = true;
|
|
283
|
+
if (this.options.IsRequired == true) {
|
|
284
|
+
this.EnglishValidationRules.push(Validators.required);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
default:
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
this.ArabicTextAreaFormControl.setValidators(this.ArabicValidationRules);
|
|
292
|
+
this.EnglishTextAreaFormControl.setValidators(this.EnglishValidationRules);
|
|
293
|
+
this.ArabicTextAreaFormControl.updateValueAndValidity();
|
|
294
|
+
this.EnglishTextAreaFormControl.updateValueAndValidity();
|
|
295
|
+
}
|
|
296
|
+
showArabicWordCount(value) {
|
|
297
|
+
this.IsShowArabicWordCount = value;
|
|
298
|
+
}
|
|
299
|
+
showEnglishWordCount(value) {
|
|
300
|
+
this.IsShowEnglishWordCount = value;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
MultiLingualTextAreaComponent.controlContainerstatic = null;
|
|
304
|
+
MultiLingualTextAreaComponent.decorators = [
|
|
305
|
+
{ type: Component, args: [{
|
|
306
|
+
selector: 'BBSF-MultiLingualTextArea',
|
|
307
|
+
template: "<div class=\"b-control b-multilangual-textarea\">\r\n <div class=\"form-group validate is-invalid\" [formGroup]=\"group\">\r\n\r\n <div class=\"form-group row\" [formGroup]=\"MultiLanguageTextAreagroup\">\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowEngishTextArea\">\r\n <label class=\"b-label col-form-label col-sm-12 \" \r\n [ngClass]=\"(options.ViewType==1)?'col-md-9':'col-md-3'\" [hidden]=\"options.IsHideEnglishLabel\">\r\n {{(options.EnglishLabelValue!=null&&options.EnglishLabelValue!=\"\")?options.EnglishLabelValue:options.LabelValue+\"in English\"}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control\" rows=\"{{options.Rows}}\" cols=\"{{options.Cols}}\"\r\n (focus)=\"showEnglishWordCount(true)\" (focusout)=\"showEnglishWordCount(false)\"\r\n maxlength=\"{{options.MaxLength}}\" minlength=\"{{options.MinLength}}\"\r\n aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"EnglishTextAreaValue\" [hidden]=\"options.IsHideEnglishFields\"\r\n [class.is-invalid]=\"EnglishTextAreaFormControl.invalid && EnglishTextAreaFormControl.touched\"\r\n placeholder=\"{{options.EnglishPlaceholder}}\" (change)=\"trimControlValue('En')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"EnglishWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputTextAreaEnglish>\r\n </textarea>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideEnglishFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputTextAreaEnglish)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowEnglishWordCount\">{{EnglishWordCount}}/{{options.MaxWordCount}} Words</div>\r\n\r\n </div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(EnglishTextAreaFormControl.invalid && EnglishTextAreaFormControl.touched)\">\r\n {{getErrorValidation(EnglishTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='') ||(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!='')\">\r\n {{(options.EnglishLabelDescription!=null&&options.EnglishLabelDescription!=\"\")?options.EnglishLabelDescription:options.LabelDescription}}\r\n </div>\r\n\r\n <!-- <div *ngIf=\"EnglishTextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"(options.MultiControlPlacementType==1)?'col-md-12':'col-md-6'\">\r\n <div class=\"row\" *ngIf=\"ShowArabicTextArea\">\r\n\r\n <label class=\"b-label col-form-label col-sm-12 \"\r\n [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.IsHideArabicLable\">\r\n {{(options.ArabicLabelValue!=null&&options.ArabicLabelValue!=\"\")?options.ArabicLabelValue:options.LabelValue+\"in Arabic\"}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\"\r\n class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n </label>\r\n <div class=\" col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n <div class=\"input-group\">\r\n <textarea class=\"form-control bnsights-control\" dir=\"rtl\" rows=\"{{options.Rows}}\" cols=\"{{options.Cols}}\"\r\n (focus)=\"showArabicWordCount(true)\" (focusout)=\"showArabicWordCount(false)\"\r\n [hidden]=\"options.IsHideArabicFields\" maxlength=\"{{options.MaxLength}}\"\r\n minlength=\"{{options.MinLength}}\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"ArabicTextAreaValue\" rows=\"{{options.Rows}}\"\r\n [class.is-invalid]=\"ArabicTextAreaFormControl.invalid && ArabicTextAreaFormControl.touched\"\r\n placeholder=\"{{options.ArabicPlaceholder}}\" (change)=\"trimControlValue('Ar')\"\r\n (keyup)=\"onTextChange()\"\r\n (keydown)=\"ArabicWordCountArray>options.MaxWordCount&&$event.keyCode !=8?$event.preventDefault():null\"\r\n #userinputTextAreaArabic>\r\n </textarea>\r\n <div class=\"input-group-append\" [hidden]=\"options.IsHideArabicFields\" *ngIf=\"options.EnableCopyToClipboard\">\r\n <span class=\"input-group-text\" (click)=\"copyInputMessage(userinputTextAreaArabic)\">\r\n <i class=\"fas fa-copy\"></i>\r\n </span>\r\n </div>\r\n <div class=\"text-muted font-weight-500 word-count\" *ngIf=\"options.MaxWordCount>0&&IsShowArabicWordCount\">{{ArabicWordCount}}/{{options.MaxWordCount}}Words</div>\r\n\r\n </div>\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(ArabicTextAreaFormControl.invalid && ArabicTextAreaFormControl.touched)\">\r\n {{getErrorValidation(ArabicTextAreaFormControl.errors|keyvalue)}}\r\n </div>\r\n <div class=\"control-desc\" *ngIf=\"(options.LabelDescription!=null&&options.LabelDescription!='')||(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!='')\">\r\n {{(options.ArabicLabelDescription!=null&&options.ArabicLabelDescription!=\"\")?options.ArabicLabelDescription:options.LabelDescription}}\r\n </div>\r\n\r\n <!-- <div *ngIf=\"ArabicTextAreaFormControl.valid\">{{resetError()}}</div> -->\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
|
|
308
|
+
styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}\n"]
|
|
309
|
+
},] }
|
|
310
|
+
];
|
|
311
|
+
MultiLingualTextAreaComponent.ctorParameters = () => [
|
|
312
|
+
{ type: ErrorMassageValidation },
|
|
313
|
+
{ type: FormGroupDirective },
|
|
314
|
+
{ type: ControlContainer, decorators: [{ type: Optional }] },
|
|
315
|
+
{ type: ControlUtility },
|
|
316
|
+
{ type: UtilityService },
|
|
317
|
+
{ type: BBSFTranslateService },
|
|
318
|
+
{ type: ControlValidationService }
|
|
319
|
+
];
|
|
320
|
+
MultiLingualTextAreaComponent.propDecorators = {
|
|
321
|
+
group: [{ type: Input }],
|
|
322
|
+
options: [{ type: Input }],
|
|
323
|
+
OnChange: [{ type: Output }]
|
|
324
|
+
};
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlMaW5ndWFsVGV4dEFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL011bHRpTGluZ3VhbFRleHRBcmVhL011bHRpTGluZ3VhbFRleHRBcmVhLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVcsUUFBUSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFxQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdJLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsTUFBTywwQkFBMEIsQ0FBQztBQVEzRyxNQUFNLE9BQU8sNkJBQTZCO0lBR3hDLFlBQW9CLFlBQW9DLEVBQVMsbUNBQXVELEVBQXNCLGdCQUFrQyxFQUFVLGNBQThCLEVBQVMsY0FBNkIsRUFBUyxTQUErQixFQUFTLHdCQUFpRDtRQUE1VSxpQkFBWSxHQUFaLFlBQVksQ0FBd0I7UUFBUyx3Q0FBbUMsR0FBbkMsbUNBQW1DLENBQW9CO1FBQXNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMs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QXNCLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBR0QsbUJBQW1CLENBQUMsS0FBYztRQUNoQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFBO0lBQ3BDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFjO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUE7SUFDckMsQ0FBQzs7QUExVU0sb0RBQXNCLEdBQUcsSUFBSSxDQUFDOztZQVB0QyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMseW1QQUFvRDs7YUFFckQ7OztZQWRRLHNCQUFzQjtZQURtRSxrQkFBa0I7WUFBcEMsZ0JBQWdCLHVCQW1CNkIsUUFBUTtZQWQ1SCxjQUFjO1lBR2tDLGNBQWM7WUFBOUQsb0JBQW9CO1lBQUUsd0JBQXdCOzs7b0JBZXBELEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBEb0NoZWNrLCBPcHRpb25hbCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIEZvcm1Hcm91cCwgQWJzdHJhY3RDb250cm9sLCBBc3luY1ZhbGlkYXRvckZuLCBDb250cm9sQ29udGFpbmVyLCBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEVycm9yTWFzc2FnZVZhbGlkYXRpb24gfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvdmFsaWRhdGlvbkVycm9yTWFzc2FnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW5wdXRUeXBlIH0gZnJvbSAnLi4vLi4vU2hhcmVkL0VudW1zL0lucHV0VHlwZSc7XHJcbmltcG9ydCB7IEVuZ2xpc2hBcmFiaWNEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL0VuZ2xpc2hBcmFiaWNEVE8nO1xyXG5pbXBvcnQgeyBNdWx0aUxpbmd1YWxUZXh0QXJlYU9wdGlvbnMgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL011bHRpTGluZ3VhbFRleHRBcmVhT3B0aW9ucyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgTGFuZ0NoYW5nZUV2ZW50IH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IExhbmd1YWdlTW9kZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9FbnVtcy9MYW5ndWFnZU1vZGUnO1xyXG5pbXBvcnQgeyBCQlNGVHJhbnNsYXRlU2VydmljZSwgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBVdGlsaXR5U2VydmljZSB9IGZyb20gICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1NdWx0aUxpbmd1YWxUZXh0QXJlYScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL011bHRpTGluZ3VhbFRleHRBcmVhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9NdWx0aUxpbmd1YWxUZXh0QXJlYS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aUxpbmd1YWxUZXh0QXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyc3RhdGljID0gbnVsbDtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIEVycm9ySGFuZGxlcjogRXJyb3JNYXNzYWdlVmFsaWRhdGlvbiwgcHVibGljIE11bHRpTGluZ3VhbFRleHRBcmVhRm9ybUNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lciwgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHkscHJpdmF0ZSBVdGlsaXR5U2VydmljZTpVdGlsaXR5U2VydmljZSxwcml2YXRlIHRyYW5zbGF0ZTogQkJTRlRyYW5zbGF0ZVNlcnZpY2UscHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6Q29udHJvbFZhbGlkYXRpb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBNdWx0aUxpbmd1YWxUZXh0QXJlYUNvbXBvbmVudC5jb250cm9sQ29udGFpbmVyc3RhdGljID0gdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gIH1cclxuICBASW5wdXQoKSBncm91cDogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IE11bHRpTGluZ3VhbFRleHRBcmVhT3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBFbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIE11bHRpVGV4dEFyZWFGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIE11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQXJhYmljV29yZENvdW50OiBudW1iZXIgPSAwO1xyXG4gIEFyYWJpY1dvcmRDb3VudEFycmF5OiBudW1iZXIgPSAwO1xyXG4gIEVuZ2xpc2hXb3JkQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgRW5nbGlzaFdvcmRDb3VudEFycmF5OiBudW1iZXIgPSAwO1xyXG4gIEN1cnJlbnRMYW5ndWFnZTogc3RyaW5nID0gXCJcIjtcclxuICBTaG93QXJhYmljVGV4dEFyZWE6IGJvb2xlYW5cclxuICBTaG93RW5naXNoVGV4dEFyZWE6IGJvb2xlYW5cclxuICBBcmFiaWNWYWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICBBcmFiaWNWYWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG4gIEVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICBFbmdsaXNoVmFsaWRhdGlvblJ1bGVzYXN5bmMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXNhc3luYyA9IFtdO1xyXG4gIElzU2hvd0FyYWJpY1dvcmRDb3VudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIElzU2hvd0VuZ2xpc2hXb3JkQ291bnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtYXJrQWxsQXNUb3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIFxyXG4gIEFyYWJpY0xldHRlck9ubHk6c3RyaW5nPVwiXCJcclxuICBFbmdsaXNoTGV0dGVyT25seTpzdHJpbmc9XCJcIlxyXG5cclxuIGdldEN1c3RvbUVycm9yc01hc3NhZ2VzKCkge1xyXG4gICAgdGhpcy5BcmFiaWNMZXR0ZXJPbmx5ID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQXJhYmljTGV0dGVyT25seVwiKTtcclxuICAgIHRoaXMuRW5nbGlzaExldHRlck9ubHkgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFbmdsaXNoTGV0dGVyT25seVwiKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5pc0NyZWF0ZWRCZWZvciA9IGZhbHNlXHJcbiAgICB0aGlzLkN1cnJlbnRMYW5ndWFnZSA9IGF3YWl0IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCk7XHJcbiAgICAvLyBVdGlsaXR5U2VydmljZS5UcmFuc2xhdG9yLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50OiBMYW5nQ2hhbmdlRXZlbnQpID0+IHtcclxuICAgIC8vICAgdGhpcy5DdXJyZW50TGFuZ3VhZ2UgPSBldmVudC5sYW5nXHJcbiAgICAvLyAgIHRoaXMuc2hvd0lucHV0VXNpbmdMYW5ndWFnZU1vZGUoKTtcclxuXHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkFyYWJpY0xhYmVsS2V5ICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkFyYWJpY0xhYmVsS2V5ICE9IFwiXCIpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5BcmFiaWNMYWJlbFZhbHVlID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKHRoaXMub3B0aW9ucy5BcmFiaWNMYWJlbEtleSk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5FbmdsaXNoTGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuRW5nbGlzaExhYmVsS2V5ICE9IFwiXCIpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5FbmdsaXNoTGFiZWxWYWx1ZSA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMuRW5nbGlzaExhYmVsS2V5KTtcclxuXHJcbiAgICB0aGlzLk11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICB0aGlzLk11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmFkZENvbnRyb2woXCJBcmFiaWNUZXh0QXJlYVZhbHVlXCIsIG5ldyBGb3JtQ29udHJvbCgnJykpO1xyXG4gICAgdGhpcy5NdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5hZGRDb250cm9sKFwiRW5nbGlzaFRleHRBcmVhVmFsdWVcIiwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLkFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wgPSB0aGlzLk11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljVGV4dEFyZWFWYWx1ZVwiXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbCA9IHRoaXMuTXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuY29udHJvbHNbXCJFbmdsaXNoVGV4dEFyZWFWYWx1ZVwiXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUdyb3VwKHRoaXMuTXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuY29udHJvbHMpKTtcclxuICAgIHRoaXMuZ2V0Q3VzdG9tRXJyb3JzTWFzc2FnZXMoKVxyXG5cclxuICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLlR5cGUpIHtcclxuICAgICAgY2FzZSBJbnB1dFR5cGUuRW1haWw6XHJcbiAgICAgICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0dGVyblZhbGlkYXRvcigvXlthLXowLTkuXyUrLV0rQFthLXowLTkuLV0rXFwuW2Etel17Miw0fSQvLCB7IEVtYWlsVmFsaWRhdGlvbktleTogXCJcIiB9KSxcclxuXHJcbiAgICAgICAgXSkpO1xyXG4gICAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0dGVyblZhbGlkYXRvcigvXlthLXowLTkuXyUrLV0rQFthLXowLTkuLV0rXFwuW2Etel17Miw0fSQvLCB7IEVtYWlsVmFsaWRhdGlvbktleTogXCJcIiB9KSxcclxuXHJcbiAgICAgICAgXSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBJbnB1dFR5cGUuTnVtYmVyOlxyXG4gICAgICAgIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybignXlswLTldKyhcXC4/WzAtOV0rKT8kJykpO1xyXG4gICAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKCdeWzAtOV0rKFxcLj9bMC05XSspPyQnKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbnMgPSB0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvblxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0aW9uLmZ1bmN0aW9uQm9keSk7XHJcbiAgICAgICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0aW9uLmZ1bmN0aW9uQm9keSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5NaW5MZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5vcHRpb25zLk1pbkxlbmd0aCkpO1xyXG4gICAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm9wdGlvbnMuTWluTGVuZ3RoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLk1heExlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5vcHRpb25zLk1heExlbmd0aCkpO1xyXG4gICAgICB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMub3B0aW9ucy5NYXhMZW5ndGgpKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zaG93SW5wdXRVc2luZ0xhbmd1YWdlTW9kZSgpO1xyXG5cclxuICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXR0ZXJuVmFsaWRhdG9yKC9bXFx1MDYyMS1cXHUwNjRBXSsvLCB7IEFyYWJpY0xldHRlck9ubHk6IHRoaXMuQXJhYmljTGV0dGVyT25seSB9KSxcclxuICAgICAgIFxyXG4gICAgXSkpO1xyXG4gICAgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgdGhpcy5jb250cm9sVXRpbGl0eS5wYXR0ZXJuVmFsaWRhdG9yKC9eW1xceDAwLVxceDdGXSokLywgeyBFbmdsaXNoTGV0dGVyT25seTogdGhpcy5FbmdsaXNoTGV0dGVyT25seSB9KSxcclxuICAgICAgIFxyXG4gICAgXSkpO1xyXG5cclxuICAgIHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXNhc3luYyk7XHJcbiAgICB0aGlzLkVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuRW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuRW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgICB0aGlzLkFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy5WYWx1ZS5BcmFiaWMpXHJcbiAgICB0aGlzLkVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy5WYWx1ZS5FbmdsaXNoKVxyXG5cclxuICAgIHRoaXMuTXVsdGlMaW5ndWFsVGV4dEFyZWFGb3JtQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlXHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG5cclxuICBvblRleHRDaGFuZ2UoKSB7XHJcbiAgICBsZXQgYXJhYmljVmFsdWUgPSBcIlwiO1xyXG4gICAgbGV0IGVuZ2xpc2hWYWx1ZSA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuRW5nbGlzaFdvcmRDb3VudEFycmF5ID0gMDtcclxuICAgICAgdGhpcy5FbmdsaXNoV29yZENvdW50ID0gMDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZSAhPSBudWxsIHx8IHRoaXMuRW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5FbmdsaXNoV29yZENvdW50QXJyYXkgPSB0aGlzLkVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlLnNwbGl0KFwiIFwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuRW5nbGlzaFdvcmRDb3VudEFycmF5ID4gMCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuRW5nbGlzaFdvcmRDb3VudEFycmF5ID4gdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudCkge1xyXG4gICAgICAgICAgICB0aGlzLkVuZ2xpc2hXb3JkQ291bnQgPSB0aGlzLm9wdGlvbnMuTWF4V29yZENvdW50O1xyXG4gICAgICAgICAgICB0aGlzLk11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzW1wiRW5nbGlzaFRleHRBcmVhVmFsdWVcIl0uc2V0RXJyb3JzKHsgTWF4V29yZENvdW50VmFsaWRhdGlvbktleTogdGhpcy5vcHRpb25zLk1heFdvcmRDb3VudCB9KTtcclxuICAgICAgICAgICAgdGhpcy5NdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5jb250cm9sc1tcIkVuZ2xpc2hUZXh0QXJlYVZhbHVlXCJdLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5NdWx0aUxhbmd1YWdlVGV4dEFyZWFncm91cC5jb250cm9sc1tcIkVuZ2xpc2hUZXh0QXJlYVZhbHVlXCJdLmludmFsaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5FbmdsaXNoV29yZENvdW50ID0gdGhpcy5FbmdsaXNoV29yZENvdW50QXJyYXk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbmdsaXNoVmFsdWU9dGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuQXJhYmljV29yZENvdW50QXJyYXkgPSAwO1xyXG4gICAgICB0aGlzLkFyYWJpY1dvcmRDb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZSAhPSBudWxsIHx8IHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLkFyYWJpY1dvcmRDb3VudEFycmF5ID0gdGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlLnNwbGl0KFwiIFwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuQXJhYmljV29yZENvdW50QXJyYXkgPiAwKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5BcmFiaWNXb3JkQ291bnRBcnJheSA+IHRoaXMub3B0aW9ucy5NYXhXb3JkQ291bnQpIHtcclxuICAgICAgICAgICAgdGhpcy5BcmFiaWNXb3JkQ291bnQgPSB0aGlzLm9wdGlvbnMuTWF4V29yZENvdW50O1xyXG4gICAgICAgICAgICB0aGlzLk11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljVGV4dEFyZWFWYWx1ZVwiXS5zZXRFcnJvcnMoeyBNYXhXb3JkQ291bnRWYWxpZGF0aW9uS2V5OiB0aGlzLm9wdGlvbnMuTWF4V29yZENvdW50IH0pO1xyXG4gICAgICAgICAgICB0aGlzLk11bHRpTGFuZ3VhZ2VUZXh0QXJlYWdyb3VwLmNvbnRyb2xzW1wiQXJhYmljVGV4dEFyZWFWYWx1ZVwiXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuTXVsdGlMYW5ndWFnZVRleHRBcmVhZ3JvdXAuY29udHJvbHNbXCJBcmFiaWNUZXh0QXJlYVZhbHVlXCJdLmludmFsaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5BcmFiaWNXb3JkQ291bnQgPSB0aGlzLkFyYWJpY1dvcmRDb3VudEFycmF5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXJhYmljVmFsdWU9dGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIGxldCBtdWxpdExhbmdNb2RlbCA9IG5ldyBFbmdsaXNoQXJhYmljRFRPKCk7XHJcbiAgICBtdWxpdExhbmdNb2RlbC5BcmFiaWMgPSBhcmFiaWNWYWx1ZTtcclxuICAgIG11bGl0TGFuZ01vZGVsLkVuZ2xpc2ggPSBlbmdsaXNoVmFsdWU7XHJcbiAgICB0aGlzLk9uQ2hhbmdlLmVtaXQobXVsaXRMYW5nTW9kZWwpXHJcbiAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUobXVsaXRMYW5nTW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRFcnJvciA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLlJlbW92ZUdsb2JhbEVycm9yKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKClcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2VcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoRXJyb3JMaXN0LCB0aGlzLmdyb3VwLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW5wdXRUeXBlKHR5cGU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIElucHV0VHlwZVt0eXBlXVxyXG4gIH1cclxuXHJcbiAgdHJpbUNvbnRyb2xWYWx1ZSh0eXBlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHdoaXRlc3BhY2U6IHN0cmluZyA9ICcgJztcclxuICAgIGlmICh0eXBlID09IFwiRW5cIikge1xyXG4gICAgICBpZiAodGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS5zdGFydHNXaXRoKHdoaXRlc3BhY2UpIHx8IHRoaXMuRW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wudmFsdWUuZW5kc1dpdGgod2hpdGVzcGFjZSkpIHtcclxuICAgICAgICB0aGlzLkVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sLnBhdGNoVmFsdWUodGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS50cmltKCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PSBcIkFyXCIpIHtcclxuICAgICAgaWYgKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS5zdGFydHNXaXRoKHdoaXRlc3BhY2UpIHx8IHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS5lbmRzV2l0aCh3aGl0ZXNwYWNlKSkge1xyXG4gICAgICAgIHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbC52YWx1ZS50cmltKCkpO1xyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNvcHlJbnB1dE1lc3NhZ2UoaW5wdXRFbGVtZW50KSB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkNvcHlJbnB1dE1lc3NhZ2UoaW5wdXRFbGVtZW50KVxyXG4gIH1cclxuXHJcblxyXG4gIHNob3dJbnB1dFVzaW5nTGFuZ3VhZ2VNb2RlKCkge1xyXG5cclxuICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzID0gdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMgPSB0aGlzLkVuZ2xpc2hWYWxpZGF0aW9uUnVsZXMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgdGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgdGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICB0aGlzLkFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuTGFuZ3VhZ2VNb2RlKSB7XHJcbiAgICAgIGNhc2UgTGFuZ3VhZ2VNb2RlLkJvdGhfTGFuZ3VhZ2VzX2FyZV92aXNpYmxlOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLlNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkID09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5BcmFiaWNfTGFuZ3VhZ2Vfb25seV9pc192aXNpYmxlOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBMYW5ndWFnZU1vZGUuRW5nbGlzaF9MYW5ndWFnZV9vbmx5X2lzX3Zpc2libGU6XHJcbiAgICAgICAgdGhpcy5TaG93RW5naXNoVGV4dEFyZWEgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5Cb3RoX0xhbmd1YWdlc19hcmVfdmlzaWJsZV9idXRfb25seV9jdXJyZW50X2xhbmd1YWdlX2lzX3JlcXVpcmVkOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLlNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnYXInKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VycmVudExhbmd1YWdlID09ICdlbicpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5Cb3RoX0xhbmd1YWdlc19idXRfb25seV9BcmFiaWNfaXNfcmVxdWlyZWQ6XHJcbiAgICAgICAgdGhpcy5TaG93QXJhYmljVGV4dEFyZWEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuU2hvd0VuZ2lzaFRleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIExhbmd1YWdlTW9kZS5Cb3RoX0xhbmd1YWdlc19idXRfb25seV9FbmdsaXNoX2lzX3JlcXVpcmVkOlxyXG4gICAgICAgIHRoaXMuU2hvd0FyYWJpY1RleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLlNob3dFbmdpc2hUZXh0QXJlYSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkID09IHRydWUpIHtcclxuICAgICAgICAgIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTGFuZ3VhZ2VNb2RlLkN1cnJlbnRfTGFuZ3VhZ2Vfb25seV9pc192aXNpYmxlX2FuZF9yZXF1aXJlZDpcclxuICAgICAgICBpZiAodGhpcy5DdXJyZW50TGFuZ3VhZ2UgPT0gJ2FyJykge1xyXG4gICAgICAgICAgdGhpcy5TaG93QXJhYmljVGV4dEFyZWEgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5TaG93RW5naXNoVGV4dEFyZWEgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQXJhYmljVmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5DdXJyZW50TGFuZ3VhZ2UgPT0gJ2VuJykge1xyXG4gICAgICAgICAgdGhpcy5TaG93QXJhYmljVGV4dEFyZWEgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuU2hvd0VuZ2lzaFRleHRBcmVhID0gdHJ1ZTtcclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkFyYWJpY1RleHRBcmVhRm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc2hvd0FyYWJpY1dvcmRDb3VudCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5Jc1Nob3dBcmFiaWNXb3JkQ291bnQgPSB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgc2hvd0VuZ2xpc2hXb3JkQ291bnQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuSXNTaG93RW5nbGlzaFdvcmRDb3VudCA9IHZhbHVlXHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIFJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuRW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLCB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIEFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuRW5nbGlzaFRleHRBcmVhRm9ybUNvbnRyb2wsIHRoaXMuRW5nbGlzaFZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5BcmFiaWNUZXh0QXJlYUZvcm1Db250cm9sLCB0aGlzLkFyYWJpY1ZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuXHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVDdXN0b21WYWxpZGF0aW9uKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZEN1c3RvbVZhbGlkYXRpb24odGhpcy5FbmdsaXNoVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5FbmdsaXNoVmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRDdXN0b21WYWxpZGF0aW9uKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbCwgdGhpcy5BcmFiaWNWYWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgSXNWYWxpZCA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuSXNWYWxpZCh0aGlzLkVuZ2xpc2hUZXh0QXJlYUZvcm1Db250cm9sKVxyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Jc1ZhbGlkKHRoaXMuQXJhYmljVGV4dEFyZWFGb3JtQ29udHJvbClcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
|