@bnsights/bbsf-controls 1.0.109 → 1.0.110
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 +4 -0
- package/{esm2020 → esm2022}/bnsights-bbsf-controls.mjs +4 -4
- package/{esm2020 → esm2022}/lib/Shared/Components/app-base-component.mjs +226 -226
- package/{esm2020 → esm2022}/lib/Shared/Components/ng-tag-input.mjs +176 -176
- package/{esm2020 → esm2022}/lib/Shared/Directives/template-name.directive.mjs +18 -18
- package/{esm2020 → esm2022}/lib/Shared/Enums/CalendarView.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Enums/ControlLayout.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/Countries.mjs +246 -246
- package/{esm2020 → esm2022}/lib/Shared/Enums/Enums.mjs +32 -32
- package/{esm2020 → esm2022}/lib/Shared/Enums/FileType.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/Enums/FilterType.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Enums/FontSize.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/ForceDirection.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/IconPosition.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/ImageType.mjs +9 -9
- package/{esm2020 → esm2022}/lib/Shared/Enums/InputType.mjs +9 -9
- package/{esm2020 → esm2022}/lib/Shared/Enums/Insert.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Enums/LanguageMode.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Enums/LanguageValidation.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/Misc.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/PagingActionMode.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/Para.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Enums/PickerType.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/SelectMode.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Enums/StartView.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/Style.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Enums/StyleConfirmationMode.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/TagInputView.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Enums/menu-list-enum.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/Attribute.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/AutocompleteDTO.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Models/AutocompleteOptions.mjs +23 -23
- package/{esm2020 → esm2022}/lib/Shared/Models/CalendarEventDTO.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/CalendarOptions.mjs +18 -18
- package/{esm2020 → esm2022}/lib/Shared/Models/CancelDTO.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/CaptchaStyle.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/CheckBoxOptions.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/ConfirmationModalOptions.mjs +38 -38
- package/{esm2020 → esm2022}/lib/Shared/Models/ControlOptionsBase.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/CustomValidation.mjs +13 -13
- package/{esm2020 → esm2022}/lib/Shared/Models/DropdownListItem.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/DropdownOptions.mjs +15 -15
- package/{esm2020 → esm2022}/lib/Shared/Models/EditPersonalImage.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/EnglishArabicDTO.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/FileDTO.mjs +1 -1
- package/{esm2020 → esm2022}/lib/Shared/Models/FileUploadModel.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/FileUploadOptions.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/FilterItem.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Models/FormOptions.mjs +27 -27
- package/{esm2020 → esm2022}/lib/Shared/Models/HtmlEditorOptions.mjs +11 -11
- package/{esm2020 → esm2022}/lib/Shared/Models/ImageUploadOptions.mjs +13 -13
- package/{esm2020 → esm2022}/lib/Shared/Models/MapAutoCompleteOptions.mjs +3 -3
- package/{esm2020 → esm2022}/lib/Shared/Models/MapAutocompleteDTO.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/MultiLingualTextAreaOptions.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/MultilingualControlOptionsBase.mjs +15 -15
- package/{esm2020 → esm2022}/lib/Shared/Models/MultilingualTextBoxOptions.mjs +13 -13
- package/{esm2020 → esm2022}/lib/Shared/Models/MultipleFileUploadModel.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/PagingDTO.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/PagingOptions.mjs +46 -46
- package/{esm2020 → esm2022}/lib/Shared/Models/PagingPayload.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/PhoneOptions.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/ProfileImageUploadOptions.mjs +10 -10
- package/{esm2020 → esm2022}/lib/Shared/Models/ProfilePictureDTO.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/RadioButtonItem.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/RadioButtonOptions.mjs +3 -3
- package/{esm2020 → esm2022}/lib/Shared/Models/RangeNumber.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/Recaptcha.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/RecaptchaOptions.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/Models/RepeaterField.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/RepeaterOptions.mjs +12 -12
- package/{esm2020 → esm2022}/lib/Shared/Models/SaveDTO.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/TagsInputDTO.mjs +2 -2
- package/{esm2020 → esm2022}/lib/Shared/Models/TagsInputOptions.mjs +40 -40
- package/{esm2020 → esm2022}/lib/Shared/Models/TextAreaOptions.mjs +3 -3
- package/{esm2020 → esm2022}/lib/Shared/Models/TextBoxOptions.mjs +22 -22
- package/{esm2020 → esm2022}/lib/Shared/Models/ToggleslideOptions.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/UploadPersonalImage.mjs +6 -6
- package/{esm2020 → esm2022}/lib/Shared/Models/bread-crumb.mjs +7 -7
- package/{esm2020 → esm2022}/lib/Shared/Models/control-filter-Item.mjs +5 -5
- package/{esm2020 → esm2022}/lib/Shared/Models/datePickerOptions.mjs +22 -22
- package/{esm2020 → esm2022}/lib/Shared/Models/filter-options.mjs +8 -8
- package/{esm2020 → esm2022}/lib/Shared/Models/page-header-options.mjs +77 -77
- package/{esm2020 → esm2022}/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/Pipes/bbsf-date.pipe.mjs +21 -21
- package/{esm2020 → esm2022}/lib/Shared/config/environment.mjs +11 -11
- package/{esm2020 → esm2022}/lib/Shared/default_intl.mjs +29 -29
- package/{esm2020 → esm2022}/lib/Shared/services/ControlUtility.mjs +162 -162
- package/{esm2020 → esm2022}/lib/Shared/services/GlobalSettings.service.mjs +30 -30
- package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +24 -0
- package/{esm2020 → esm2022}/lib/Shared/services/render-component-service.service.mjs +30 -30
- package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +170 -0
- package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +262 -0
- package/esm2022/lib/controls/Calendar/Calendar.component.mjs +173 -0
- package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +117 -0
- package/{esm2020 → esm2022}/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +136 -136
- package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +223 -0
- package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +193 -0
- package/esm2022/lib/controls/FileUplaod/FileUplaod.component.mjs +447 -0
- package/{esm2020 → esm2022}/lib/controls/Form/Form.component.mjs +101 -101
- package/esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs +226 -0
- package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +350 -0
- package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +324 -0
- package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +427 -0
- package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +429 -0
- package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +428 -0
- package/{esm2020 → esm2022}/lib/controls/Paging/JwPagination.component.mjs +121 -121
- package/{esm2020 → esm2022}/lib/controls/Paging/Paging.component.mjs +312 -312
- package/esm2022/lib/controls/Phone/Phone.component.mjs +129 -0
- package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +376 -0
- package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +109 -0
- package/{esm2020 → esm2022}/lib/controls/Recaptcha/Recaptcha.component.mjs +135 -135
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater/repeater.component.mjs +125 -125
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +750 -750
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +21 -21
- package/{esm2020 → esm2022}/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +108 -108
- package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +277 -0
- package/esm2022/lib/controls/TextArea/TextArea.component.mjs +196 -0
- package/esm2022/lib/controls/TextBox/TextBox.component.mjs +306 -0
- package/esm2022/lib/controls/Toggleslide/toggleslide.component.mjs +90 -0
- package/esm2022/lib/controls/bbsf-controls.module.mjs +350 -0
- package/{esm2020 → esm2022}/lib/controls/page-header-component/page-header-component.component.mjs +37 -37
- package/{esm2020 → esm2022}/public-api.mjs +130 -130
- package/{fesm2020 → fesm2022}/bnsights-bbsf-controls.mjs +8718 -8735
- package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/Shared/Components/app-base-component.d.ts +58 -58
- package/lib/Shared/Components/ng-tag-input.d.ts +50 -50
- package/lib/Shared/Directives/template-name.directive.d.ts +9 -9
- package/lib/Shared/Enums/CalendarView.d.ts +6 -6
- package/lib/Shared/Enums/ControlLayout.d.ts +4 -4
- package/lib/Shared/Enums/Countries.d.ts +245 -245
- package/lib/Shared/Enums/Enums.d.ts +30 -30
- package/lib/Shared/Enums/FileType.d.ts +20 -20
- package/lib/Shared/Enums/FilterType.d.ts +9 -9
- package/lib/Shared/Enums/FontSize.d.ts +5 -5
- package/lib/Shared/Enums/ForceDirection.d.ts +4 -4
- package/lib/Shared/Enums/IconPosition.d.ts +4 -4
- package/lib/Shared/Enums/ImageType.d.ts +8 -8
- package/lib/Shared/Enums/InputType.d.ts +8 -8
- package/lib/Shared/Enums/Insert.d.ts +7 -7
- package/lib/Shared/Enums/LanguageMode.d.ts +9 -9
- package/lib/Shared/Enums/LanguageValidation.d.ts +4 -4
- package/lib/Shared/Enums/Misc.d.ts +5 -5
- package/lib/Shared/Enums/PagingActionMode.d.ts +4 -4
- package/lib/Shared/Enums/Para.d.ts +7 -7
- package/lib/Shared/Enums/PickerType.d.ts +5 -5
- package/lib/Shared/Enums/SelectMode.d.ts +4 -4
- package/lib/Shared/Enums/StartView.d.ts +5 -5
- package/lib/Shared/Enums/Style.d.ts +6 -6
- package/lib/Shared/Enums/StyleConfirmationMode.d.ts +5 -5
- package/lib/Shared/Enums/TagInputView.d.ts +5 -5
- package/lib/Shared/Enums/menu-list-enum.d.ts +4 -4
- package/lib/Shared/Models/Attribute.d.ts +4 -4
- package/lib/Shared/Models/AutocompleteDTO.d.ts +5 -5
- package/lib/Shared/Models/AutocompleteOptions.d.ts +40 -40
- package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -8
- package/lib/Shared/Models/CalendarOptions.d.ts +23 -23
- package/lib/Shared/Models/CancelDTO.d.ts +5 -5
- package/lib/Shared/Models/CaptchaStyle.d.ts +7 -7
- package/lib/Shared/Models/CheckBoxOptions.d.ts +7 -7
- package/lib/Shared/Models/ConfirmationModalOptions.d.ts +21 -21
- package/lib/Shared/Models/ControlOptionsBase.d.ts +44 -44
- package/lib/Shared/Models/CustomValidation.d.ts +10 -10
- package/lib/Shared/Models/DropdownListItem.d.ts +4 -4
- package/lib/Shared/Models/DropdownOptions.d.ts +33 -33
- package/lib/Shared/Models/EditPersonalImage.d.ts +5 -5
- package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -4
- package/lib/Shared/Models/FileDTO.d.ts +19 -19
- package/lib/Shared/Models/FileUploadModel.d.ts +4 -4
- package/lib/Shared/Models/FileUploadOptions.d.ts +19 -19
- package/lib/Shared/Models/FilterItem.d.ts +13 -13
- package/lib/Shared/Models/FormOptions.d.ts +16 -16
- package/lib/Shared/Models/HtmlEditorOptions.d.ts +31 -31
- package/lib/Shared/Models/ImageUploadOptions.d.ts +23 -23
- package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +6 -6
- package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -7
- package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +22 -22
- package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +12 -12
- package/lib/Shared/Models/MultilingualControlOptionsBase.d.ts +77 -77
- package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +12 -12
- package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -7
- package/lib/Shared/Models/PagingDTO.d.ts +11 -11
- package/lib/Shared/Models/PagingOptions.d.ts +56 -56
- package/lib/Shared/Models/PagingPayload.d.ts +5 -5
- package/lib/Shared/Models/PhoneOptions.d.ts +21 -21
- package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +28 -28
- package/lib/Shared/Models/ProfilePictureDTO.d.ts +13 -13
- package/lib/Shared/Models/RadioButtonItem.d.ts +4 -4
- package/lib/Shared/Models/RadioButtonOptions.d.ts +8 -8
- package/lib/Shared/Models/RangeNumber.d.ts +4 -4
- package/lib/Shared/Models/Recaptcha.d.ts +6 -6
- package/lib/Shared/Models/RecaptchaOptions.d.ts +18 -18
- package/lib/Shared/Models/RepeaterField.d.ts +7 -7
- package/lib/Shared/Models/RepeaterOptions.d.ts +19 -19
- package/lib/Shared/Models/SaveDTO.d.ts +5 -5
- package/lib/Shared/Models/TagsInputDTO.d.ts +6 -6
- package/lib/Shared/Models/TagsInputOptions.d.ts +57 -57
- package/lib/Shared/Models/TextAreaOptions.d.ts +23 -23
- package/lib/Shared/Models/TextBoxOptions.d.ts +37 -37
- package/lib/Shared/Models/ToggleslideOptions.d.ts +9 -9
- package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -5
- package/lib/Shared/Models/bread-crumb.d.ts +6 -6
- package/lib/Shared/Models/control-filter-Item.d.ts +6 -6
- package/lib/Shared/Models/datePickerOptions.d.ts +29 -29
- package/lib/Shared/Models/filter-options.d.ts +7 -7
- package/lib/Shared/Models/page-header-options.d.ts +71 -71
- package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +10 -10
- package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +10 -10
- package/lib/Shared/config/environment.d.ts +1 -1
- package/lib/Shared/default_intl.d.ts +21 -21
- package/lib/Shared/services/ControlUtility.d.ts +32 -32
- package/lib/Shared/services/GlobalSettings.service.d.ts +17 -17
- package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +10 -10
- package/lib/Shared/services/render-component-service.service.d.ts +10 -10
- package/lib/Shared/services/validationErrorMassage.service.d.ts +14 -14
- package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +59 -59
- package/lib/controls/Calendar/Calendar.component.d.ts +42 -42
- package/lib/controls/CheckBox/CheckBox.component.d.ts +37 -37
- package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +29 -29
- package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +61 -61
- package/lib/controls/DropdownList/DropdownList.component.d.ts +55 -55
- package/lib/controls/FileUplaod/FileUplaod.component.d.ts +58 -58
- package/lib/controls/Form/Form.component.d.ts +28 -28
- package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +49 -49
- package/lib/controls/ImageUpload/ImageUpload.component.d.ts +70 -70
- package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +49 -54
- package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +65 -65
- package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +74 -74
- package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +73 -73
- package/lib/controls/Paging/JwPagination.component.d.ts +27 -27
- package/lib/controls/Paging/Paging.component.d.ts +57 -57
- package/lib/controls/Phone/Phone.component.d.ts +43 -43
- package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +69 -69
- package/lib/controls/RadioButton/RadioButton.component.d.ts +37 -37
- package/lib/controls/Recaptcha/Recaptcha.component.d.ts +41 -41
- package/lib/controls/Repeater/repeater/repeater.component.d.ts +29 -29
- package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +23 -23
- package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +11 -11
- package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +19 -19
- package/lib/controls/TagsInput/TagsInput.component.d.ts +58 -58
- package/lib/controls/TextArea/TextArea.component.d.ts +51 -51
- package/lib/controls/TextBox/TextBox.component.d.ts +66 -66
- package/lib/controls/Toggleslide/toggleslide.component.d.ts +33 -33
- package/lib/controls/bbsf-controls.module.d.ts +68 -77
- package/lib/controls/page-header-component/page-header-component.component.d.ts +20 -20
- package/package.json +50 -63
- package/public-api.d.ts +117 -117
- package/src/lib/assets/Style.scss +4 -4
- package/esm2020/lib/Shared/services/OnPagingFiltersChange.service.mjs +0 -24
- package/esm2020/lib/Shared/services/validationErrorMassage.service.mjs +0 -170
- package/esm2020/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +0 -262
- package/esm2020/lib/controls/Calendar/Calendar.component.mjs +0 -173
- package/esm2020/lib/controls/CheckBox/CheckBox.component.mjs +0 -117
- package/esm2020/lib/controls/DateTimePicker/DateTimePicker.component.mjs +0 -223
- package/esm2020/lib/controls/DropdownList/DropdownList.component.mjs +0 -194
- package/esm2020/lib/controls/FileUplaod/FileUplaod.component.mjs +0 -447
- package/esm2020/lib/controls/HtmlEditor/HtmlEditor.component.mjs +0 -226
- package/esm2020/lib/controls/ImageUpload/ImageUpload.component.mjs +0 -350
- package/esm2020/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +0 -325
- package/esm2020/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +0 -427
- package/esm2020/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +0 -429
- package/esm2020/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +0 -428
- package/esm2020/lib/controls/Phone/Phone.component.mjs +0 -129
- package/esm2020/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +0 -376
- package/esm2020/lib/controls/RadioButton/RadioButton.component.mjs +0 -109
- package/esm2020/lib/controls/TagsInput/TagsInput.component.mjs +0 -277
- package/esm2020/lib/controls/TextArea/TextArea.component.mjs +0 -196
- package/esm2020/lib/controls/TextBox/TextBox.component.mjs +0 -312
- package/esm2020/lib/controls/Toggleslide/toggleslide.component.mjs +0 -90
- package/esm2020/lib/controls/bbsf-controls.module.mjs +0 -361
- package/fesm2015/bnsights-bbsf-controls.mjs +0 -9159
- package/fesm2015/bnsights-bbsf-controls.mjs.map +0 -1
- package/fesm2020/bnsights-bbsf-controls.mjs.map +0 -1
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
import { Component, Input, Optional, ViewChild, Output, EventEmitter, } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators, } from '@angular/forms';
|
|
3
|
+
import { FileUploader, FileLikeObject } from 'ng2-file-upload';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../../Shared/services/ControlUtility";
|
|
6
|
+
import * as i2 from "@angular/forms";
|
|
7
|
+
import * as i3 from "@bnsights/bbsf-utilities";
|
|
8
|
+
import * as i4 from "../../Shared/services/GlobalSettings.service";
|
|
9
|
+
import * as i5 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
+
import * as i6 from "@angular/common";
|
|
11
|
+
import * as i7 from "angular-cropperjs";
|
|
12
|
+
import * as i8 from "ngx-dropzone";
|
|
13
|
+
import * as i9 from "ngx-intl-tel-input";
|
|
14
|
+
export class ImageUploaderComponent {
|
|
15
|
+
static { this.controlContainerstatic = null; }
|
|
16
|
+
constructor(zone, controlUtility, controlContainer, ImageUplaoderControlHost, UtilityService, controlValidationService, globalSettings, modalService) {
|
|
17
|
+
this.zone = zone;
|
|
18
|
+
this.controlUtility = controlUtility;
|
|
19
|
+
this.controlContainer = controlContainer;
|
|
20
|
+
this.ImageUplaoderControlHost = ImageUplaoderControlHost;
|
|
21
|
+
this.UtilityService = UtilityService;
|
|
22
|
+
this.controlValidationService = controlValidationService;
|
|
23
|
+
this.globalSettings = globalSettings;
|
|
24
|
+
this.modalService = modalService;
|
|
25
|
+
this.files = [];
|
|
26
|
+
this.OnChange = new EventEmitter();
|
|
27
|
+
this.ValidationMessage = '';
|
|
28
|
+
this.AcceptedType = '';
|
|
29
|
+
this.AcceptedTypeArray = [];
|
|
30
|
+
this.ToolTipTypeArray = [];
|
|
31
|
+
this.imgUrl = null;
|
|
32
|
+
this.config = null;
|
|
33
|
+
this.imageUrl = '';
|
|
34
|
+
this.imgwUrl = '';
|
|
35
|
+
this.mdlSampleIsOpen = false;
|
|
36
|
+
this.markAllAsTouched = false;
|
|
37
|
+
this.validationRules = [];
|
|
38
|
+
this.validationRulesasync = [];
|
|
39
|
+
this.maxFileSize = 0;
|
|
40
|
+
this.resetError = () => {
|
|
41
|
+
this.controlValidationService.removeGlobalError();
|
|
42
|
+
};
|
|
43
|
+
//External Method
|
|
44
|
+
this.RemoveRequiredValidation = () => {
|
|
45
|
+
this.controlUtility.RemoveRequiredValidation(this.ImageUploadFormControl, this.validationRules, this.options);
|
|
46
|
+
};
|
|
47
|
+
//External Method
|
|
48
|
+
this.AddRequiredValidation = () => {
|
|
49
|
+
this.controlUtility.AddRequiredValidation(this.ImageUploadFormControl, this.validationRules, this.options);
|
|
50
|
+
};
|
|
51
|
+
//External Method
|
|
52
|
+
this.RemoveCustomValidation = (CustomValidation) => {
|
|
53
|
+
this.controlUtility.RemoveCustomValidation(this.ImageUploadFormControl, this.validationRules, CustomValidation);
|
|
54
|
+
};
|
|
55
|
+
//External Method
|
|
56
|
+
this.AddCustomValidation = (CustomValidation) => {
|
|
57
|
+
this.controlUtility.AddCustomValidation(this.ImageUploadFormControl, this.validationRules, CustomValidation);
|
|
58
|
+
};
|
|
59
|
+
//External Method
|
|
60
|
+
this.IsValid = () => {
|
|
61
|
+
this.controlUtility.IsValid(this.ImageUploadFormControl);
|
|
62
|
+
};
|
|
63
|
+
ImageUploaderComponent.controlContainerstatic = this.controlContainer;
|
|
64
|
+
this.uploader = new FileUploader({
|
|
65
|
+
disableMultipart: false, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
|
|
66
|
+
});
|
|
67
|
+
this.hasAnotherDropZoneOver = false;
|
|
68
|
+
}
|
|
69
|
+
ngOnInit() {
|
|
70
|
+
this.controlValidationService.isCreatedBefor = false;
|
|
71
|
+
if (!this.options.ViewType)
|
|
72
|
+
this.options.ViewType = this.globalSettings.ViewType;
|
|
73
|
+
if (!this.options.DefaultImageSrc)
|
|
74
|
+
this.options.DefaultImageSrc = this.globalSettings.DefaultImageSrc;
|
|
75
|
+
//Set img src by default value
|
|
76
|
+
// this.ImageSource = this.options.DefaultImageSrc;
|
|
77
|
+
if (this.options.AllowImageCropper) {
|
|
78
|
+
this.config = {
|
|
79
|
+
aspectRatio: this.options.ImageCropperWidth / this.options.ImageCropperHeight,
|
|
80
|
+
dragMode: 'move',
|
|
81
|
+
background: true,
|
|
82
|
+
movable: true,
|
|
83
|
+
rotatable: true,
|
|
84
|
+
scalable: true,
|
|
85
|
+
zoomable: true,
|
|
86
|
+
viewMode: 1,
|
|
87
|
+
checkImageOrigin: true,
|
|
88
|
+
modal: true,
|
|
89
|
+
checkCrossOrigin: false,
|
|
90
|
+
width: this.options.ImageCropperWidth,
|
|
91
|
+
height: this.options.ImageCropperHeight,
|
|
92
|
+
cropBoxResizable: false,
|
|
93
|
+
autoCrop: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (this.options.FileUploadAcceptsTypes != null) {
|
|
97
|
+
this.options.FileUploadAcceptsTypes;
|
|
98
|
+
}
|
|
99
|
+
if (this.options.Value != null) {
|
|
100
|
+
let imgURL = this.options.Value['fileURL'];
|
|
101
|
+
if (imgURL != '' && imgURL != undefined && imgURL != null) {
|
|
102
|
+
this.ImageSource = imgURL;
|
|
103
|
+
this.imageUrl = imgURL;
|
|
104
|
+
}
|
|
105
|
+
let element = this.options.Value;
|
|
106
|
+
this.FileLikeObject = new FileLikeObject({
|
|
107
|
+
name: element.FileName,
|
|
108
|
+
size: element.FileSizeInMB * 1000 * 1000,
|
|
109
|
+
type: element.FileType,
|
|
110
|
+
});
|
|
111
|
+
this.uploader.addToQueue([this.FileLikeObject]);
|
|
112
|
+
}
|
|
113
|
+
if (this.options.FileMaxSizeInMB)
|
|
114
|
+
this.maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
115
|
+
if (this.options.FileUploadAcceptsTypes != null &&
|
|
116
|
+
this.options.FileUploadAcceptsTypes.length > 0) {
|
|
117
|
+
for (let index = 0; index < this.options.FileUploadAcceptsTypes.length; index++) {
|
|
118
|
+
const Type = this.options.FileUploadAcceptsTypes[index];
|
|
119
|
+
this.AcceptedType = this.AcceptedType.toUpperCase() + Type.toUpperCase();
|
|
120
|
+
}
|
|
121
|
+
this.AcceptedTypeArray = this.AcceptedType.split(',');
|
|
122
|
+
for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
|
|
123
|
+
const element = this.AcceptedTypeArray[index];
|
|
124
|
+
const TypeToolTipe = element.split('/')[1];
|
|
125
|
+
this.ToolTipTypeArray.push(TypeToolTipe.toUpperCase());
|
|
126
|
+
}
|
|
127
|
+
this.ValidationMessage =
|
|
128
|
+
this.ValidationMessage +
|
|
129
|
+
this.UtilityService.getResourceValue('AllowedTypes') +
|
|
130
|
+
` (${this.ToolTipTypeArray}) `;
|
|
131
|
+
}
|
|
132
|
+
if (this.options.FileMaxSizeInMB > 0) {
|
|
133
|
+
this.ValidationMessage =
|
|
134
|
+
this.ValidationMessage +
|
|
135
|
+
` <br /> ${this.UtilityService.getResourceValue('FileMaxSizeInMB')} ${this.options.FileMaxSizeInMB}`;
|
|
136
|
+
}
|
|
137
|
+
if (this.options.FileUploadAcceptsTypes != null &&
|
|
138
|
+
this.options.FileUploadAcceptsTypes.length > 0) {
|
|
139
|
+
}
|
|
140
|
+
this.group.addControl(this.options.Name, new FormControl(''));
|
|
141
|
+
this.ImageUploadFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
|
|
142
|
+
if (this.options.Value != null)
|
|
143
|
+
this.group.get(this.options.Name).setValue(this.options.Value);
|
|
144
|
+
if (this.options.LabelKey != null && this.options.LabelKey != '')
|
|
145
|
+
this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
|
|
146
|
+
if (this.options.CustomValidation.length > 0) {
|
|
147
|
+
let Validations = this.options.CustomValidation;
|
|
148
|
+
for (let index = 0; index < Validations.length; index++) {
|
|
149
|
+
const Validation = Validations[index];
|
|
150
|
+
this.validationRules.push(Validation.functionBody);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (this.options.IsRequired) {
|
|
154
|
+
this.validationRules.push(Validators.required);
|
|
155
|
+
}
|
|
156
|
+
this.ImageUploadFormControl.setValidators(this.validationRules);
|
|
157
|
+
this.ImageUploadFormControl.setAsyncValidators(this.validationRulesasync);
|
|
158
|
+
if (this.options.IsDisabled) {
|
|
159
|
+
this.ImageUploadFormControl.disable();
|
|
160
|
+
}
|
|
161
|
+
this.ImageUplaoderControlHost.ngSubmit.subscribe((value) => {
|
|
162
|
+
this.group.markAllAsTouched();
|
|
163
|
+
this.markAllAsTouched = true;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
ngAfterViewInit() {
|
|
167
|
+
if (this.options.AttributeList != null) {
|
|
168
|
+
var element = document.getElementById(this.options.Name);
|
|
169
|
+
for (let index = 0; index < this.options.AttributeList.length; index++) {
|
|
170
|
+
element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
showImageUploader(element) {
|
|
175
|
+
let input = element.parentElement.parentElement.querySelector('input[type=file]');
|
|
176
|
+
input.click();
|
|
177
|
+
}
|
|
178
|
+
showGlobalError() {
|
|
179
|
+
this.controlUtility.showGlobalError();
|
|
180
|
+
}
|
|
181
|
+
getErrorValidation(ErrorList) {
|
|
182
|
+
if (this.markAllAsTouched && this.group.invalid) {
|
|
183
|
+
this.showGlobalError();
|
|
184
|
+
this.markAllAsTouched = false;
|
|
185
|
+
}
|
|
186
|
+
return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
|
|
187
|
+
}
|
|
188
|
+
onFileChange(event) {
|
|
189
|
+
if (event.rejectedFiles.length > 0) {
|
|
190
|
+
const file = event.rejectedFiles[0];
|
|
191
|
+
const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
192
|
+
const fileType = file.type;
|
|
193
|
+
if (file.size > maxFileSize) {
|
|
194
|
+
const formControl = this.ImageUploadFormControl;
|
|
195
|
+
formControl.setErrors({
|
|
196
|
+
FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
|
|
197
|
+
});
|
|
198
|
+
formControl.markAsTouched();
|
|
199
|
+
this.uploader.queue = [];
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (this.options.FileUploadAcceptsTypes != null &&
|
|
203
|
+
this.options.FileUploadAcceptsTypes.length > 0 &&
|
|
204
|
+
!(this.AcceptedTypeArray.includes(fileType.toUpperCase()) ||
|
|
205
|
+
this.AcceptedTypeArray.includes(fileType.toLowerCase()))) {
|
|
206
|
+
const formControl = this.ImageUploadFormControl;
|
|
207
|
+
formControl.setErrors({ ToolTipTypeError: this.ToolTipTypeArray });
|
|
208
|
+
formControl.markAsTouched();
|
|
209
|
+
this.uploader.queue = [];
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
let FilesArray = [];
|
|
214
|
+
for (let index = 0; index < event.addedFiles.length; index++) {
|
|
215
|
+
const file = event.addedFiles[0];
|
|
216
|
+
this.EventFile = file;
|
|
217
|
+
const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
218
|
+
if (file) {
|
|
219
|
+
const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
|
|
220
|
+
const fileType = file.type;
|
|
221
|
+
if (file.size > maxFileSize) {
|
|
222
|
+
const formControl = this.ImageUploadFormControl;
|
|
223
|
+
formControl.setErrors({
|
|
224
|
+
FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M',
|
|
225
|
+
});
|
|
226
|
+
formControl.markAsTouched();
|
|
227
|
+
this.uploader.queue = [];
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
let reader = new FileReader();
|
|
231
|
+
let FileObject = file;
|
|
232
|
+
reader.readAsDataURL(FileObject);
|
|
233
|
+
reader.onload = () => {
|
|
234
|
+
if (this.options.AllowImageCropper) {
|
|
235
|
+
this.imageUrl = reader.result.toString();
|
|
236
|
+
this.openModal(true);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
let FileObject = {
|
|
240
|
+
FileName: file.name,
|
|
241
|
+
FileType: file.type,
|
|
242
|
+
FileBase64: reader.result.toString().split(',')[1],
|
|
243
|
+
FileSizeInMB: file.size / 1000 / 1000,
|
|
244
|
+
NameWithExtension: file.name,
|
|
245
|
+
};
|
|
246
|
+
this.options.Value = FileObject;
|
|
247
|
+
FilesArray.push(FileObject);
|
|
248
|
+
this.group.get(this.options.Name).setValue(FileObject);
|
|
249
|
+
this.files = [];
|
|
250
|
+
this.files.push(...event.addedFiles);
|
|
251
|
+
}
|
|
252
|
+
let originalValue = this.ImageUploadFormControl.value;
|
|
253
|
+
if (this.options.PatchFunction &&
|
|
254
|
+
this.options.PatchPath &&
|
|
255
|
+
this.ImageUploadFormControl.valid) {
|
|
256
|
+
this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
|
|
257
|
+
}
|
|
258
|
+
//Use this line to enable two way binding.
|
|
259
|
+
this.options.Value = originalValue;
|
|
260
|
+
this.OnChange.emit(originalValue);
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
removeFromControlValue(event) {
|
|
266
|
+
let ItemList = this.group.get(this.options.Name).value;
|
|
267
|
+
this.files = [];
|
|
268
|
+
ItemList = null;
|
|
269
|
+
//Set Img src by default image (upload)
|
|
270
|
+
this.ImageSource = this.options.DefaultImageSrc;
|
|
271
|
+
if (this.files.length == 0 && this.options.IsRequired) {
|
|
272
|
+
this.ImageUploadFormControl.markAsTouched();
|
|
273
|
+
this.ImageUploadFormControl.setErrors(Validators.required);
|
|
274
|
+
this.ImageUploadFormControl.invalid;
|
|
275
|
+
}
|
|
276
|
+
this.group.get(this.options.Name).setValue(ItemList);
|
|
277
|
+
this.OnChange.emit(this.group.get(this.options.Name).value);
|
|
278
|
+
//Use this line to enable two way binding.
|
|
279
|
+
this.options.Value = this.group.get(this.options.Name).value;
|
|
280
|
+
}
|
|
281
|
+
cropImage() {
|
|
282
|
+
let ImageCropperObject = this.angularCropper.cropper.getCroppedCanvas({
|
|
283
|
+
width: this.options.ImageCropperWidth,
|
|
284
|
+
height: this.options.ImageCropperHeight,
|
|
285
|
+
imageSmoothingEnabled: false,
|
|
286
|
+
imageSmoothingQuality: 'high',
|
|
287
|
+
});
|
|
288
|
+
ImageCropperObject.toBlob((blob) => {
|
|
289
|
+
this.zone.run(() => {
|
|
290
|
+
this.getBlobFile(blob);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
getBlobFile(blob) {
|
|
295
|
+
let FilesArray = [];
|
|
296
|
+
let BlobFile;
|
|
297
|
+
let reader = new FileReader();
|
|
298
|
+
BlobFile = blob;
|
|
299
|
+
reader.readAsDataURL(BlobFile);
|
|
300
|
+
reader.onload = () => {
|
|
301
|
+
let FileObject = {
|
|
302
|
+
FileName: this.EventFile.name,
|
|
303
|
+
FileType: this.EventFile.type,
|
|
304
|
+
FileBase64: reader.result.toString().split(',')[1],
|
|
305
|
+
FileSizeInMB: BlobFile.size / 1000 / 1000,
|
|
306
|
+
NameWithExtension: this.EventFile.name,
|
|
307
|
+
};
|
|
308
|
+
BlobFile.name = this.EventFile.name;
|
|
309
|
+
FilesArray.push(FileObject);
|
|
310
|
+
this.group.get(this.options.Name).setValue(FileObject);
|
|
311
|
+
this.options.Value = FileObject;
|
|
312
|
+
this.files = [];
|
|
313
|
+
this.files.push(BlobFile);
|
|
314
|
+
this.openModal(false);
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
rotateImage(degree) {
|
|
318
|
+
this.angularCropper.cropper.rotate(degree);
|
|
319
|
+
}
|
|
320
|
+
moveImage(offsetX, offsetY) {
|
|
321
|
+
this.angularCropper.cropper.move(offsetX, offsetY);
|
|
322
|
+
}
|
|
323
|
+
zoomImage(ratio) {
|
|
324
|
+
this.angularCropper.cropper.zoom(ratio);
|
|
325
|
+
}
|
|
326
|
+
openModal(open) {
|
|
327
|
+
this.mdlSampleIsOpen = open;
|
|
328
|
+
}
|
|
329
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ImageUploaderComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
330
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ImageUploaderComponent, selector: "BBSF-ImageUpload", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "angularCropper", first: true, predicate: ["angularCropper"], descendants: true }], ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\" ngx-dropzone\r\n [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\" [multiple]=\"options.IsMultiple\" (change)=\"onFileChange($event)\" ngDefaultControl\r\n formControlName=\"{{options.Name}}\" [maxFileSize]=\"maxFileSize\" id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ImageUploadFormControl.invalid && ImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <img *ngIf=\"ImageSource\" [src]=\"ImageSource\"\r\n style=\"align-items: center;border-radius: 5px;display: flex;height: 100px;justify-content: center;margin: 10px;max-width: 180px;min-height: 100px;min-width: 180px;padding: 0px 20px;position: relative;\" />\r\n <div class=\"svg-and-validation\" *ngIf=\"!ImageSource\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\" ngx-dropzone [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\"\r\n [multiple]=\"options.IsMultiple\" (change)=\"onFileChange($event)\" ngDefaultControl formControlName=\"{{options.Name}}\"\r\n [maxFileSize]=\"maxFileSize\" id=\"{{options.Name}}\" [class.is-invalid]=\"ImageUploadFormControl.invalid && ImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div *ngIf=\"ImageSource\" #element>\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n <div *ngIf=\"!ImageSource\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(ImageUploadFormControl.invalid && ImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"ZoomIn\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"ZoomOut\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveUp\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveDown\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"RotateLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"RotateRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- readonly -->\r\n\r\n\r\n</div>", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i7.CropperComponent, selector: "angular-cropper", inputs: ["imageUrl", "settings", "cropbox", "loadImageErrorText", "cropperOptions"], outputs: ["export", "ready"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i8.NgxDropzoneComponent, selector: "ngx-dropzone, [ngx-dropzone]", inputs: ["accept", "disabled", "multiple", "maxFileSize", "expandable", "disableClick", "processDirectoryDrop", "id", "aria-label", "aria-labelledby", "aria-describedby"], outputs: ["change"] }, { kind: "directive", type: i8.NgxDropzoneLabelDirective, selector: "ngx-dropzone-label" }, { kind: "component", type: i8.NgxDropzoneImagePreviewComponent, selector: "ngx-dropzone-image-preview", inputs: ["file"] }, { kind: "directive", type: i9.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i6.KeyValuePipe, name: "keyvalue" }] }); }
|
|
331
|
+
}
|
|
332
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ImageUploaderComponent, decorators: [{
|
|
333
|
+
type: Component,
|
|
334
|
+
args: [{ selector: 'BBSF-ImageUpload', template: "<div class=\"form-group bbsf-control bbsf-image-upload\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label [hidden]=\"options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--Allow dropZone-->\r\n <div *ngIf=\"options.AllowDropZone&&!options.IsReadonly\" class=\"bbsf-input-container {{options.ExtraClasses}}\" ngx-dropzone\r\n [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\" [multiple]=\"options.IsMultiple\" (change)=\"onFileChange($event)\" ngDefaultControl\r\n formControlName=\"{{options.Name}}\" [maxFileSize]=\"maxFileSize\" id=\"{{options.Name}}\"\r\n [class.is-invalid]=\"ImageUploadFormControl.invalid && ImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"dropzone-label\">\r\n <img *ngIf=\"ImageSource\" [src]=\"ImageSource\"\r\n style=\"align-items: center;border-radius: 5px;display: flex;height: 100px;justify-content: center;margin: 10px;max-width: 180px;min-height: 100px;min-width: 180px;padding: 0px 20px;position: relative;\" />\r\n <div class=\"svg-and-validation\" *ngIf=\"!ImageSource\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"width: 50px; height: 50px;\">\r\n <path opacity=\"0.3\"\r\n d=\"M5 16C3.3 16 2 14.7 2 13C2 11.3 3.3 10 5 10H5.1C5 9.7 5 9.3 5 9C5 6.2 7.2 4 10 4C11.9 4 13.5 5 14.3 6.5C14.8 6.2 15.4 6 16 6C17.7 6 19 7.3 19 9C19 9.4 18.9 9.7 18.8 10C18.9 10 18.9 10 19 10C20.7 10 22 11.3 22 13C22 14.7 20.7 16 19 16H5ZM8 13.6H16L12.7 10.3C12.3 9.89999 11.7 9.89999 11.3 10.3L8 13.6Z\"\r\n fill=\"currentColor\" style=\"fill: #a1a1a1;\"></path>\r\n <path d=\"M11 13.6V19C11 19.6 11.4 20 12 20C12.6 20 13 19.6 13 19V13.6H11Z\" fill=\"currentColor\" style=\"fill: #989898;\"></path>\r\n </svg>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n </ngx-dropzone-label>\r\n <ngx-dropzone-image-preview class=\"dropzone-preview\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n <!--Not allowed dropZone-->\r\n <div *ngIf=\"!options.AllowDropZone&&!options.IsReadonly\">\r\n <ngx-dropzone-label *ngIf=\"files.length==0\">\r\n <div #element (click)=\"showImageUploader(element)\">\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n <div class=\"d-none {{options.ExtraClasses}}\" ngx-dropzone [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\"\r\n [multiple]=\"options.IsMultiple\" (change)=\"onFileChange($event)\" ngDefaultControl formControlName=\"{{options.Name}}\"\r\n [maxFileSize]=\"maxFileSize\" id=\"{{options.Name}}\" [class.is-invalid]=\"ImageUploadFormControl.invalid && ImageUploadFormControl.touched\">\r\n </div>\r\n <ngx-dropzone-image-preview *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\">\r\n </ngx-dropzone-image-preview>\r\n <!--Validation text-->\r\n <div class=\"bbsf-validation-msg\" *ngIf=\"ValidationMessage\" [innerHTML]=\"ValidationMessage\"></div>\r\n </div>\r\n\r\n <ngx-dropzone-label *ngIf=\"files.length==0&&options.IsReadonly\">\r\n <div *ngIf=\"ImageSource\" #element>\r\n <img [src]=\"ImageSource\" />\r\n </div>\r\n <div *ngIf=\"!ImageSource\">\r\n <span class=\"readonly-view\">{{UtilityService.getResourceValue('NA')}}</span>\r\n </div>\r\n </ngx-dropzone-label>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- required text-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(ImageUploadFormControl.invalid && ImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty) \">{{resetError()}}</div>\r\n </div>\r\n <!-- image cropper modal-->\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': mdlSampleIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{UtilityService.getResourceValue(\"CropImage\")}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"openModal(false)\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"imageUrl\">\r\n <angular-cropper #angularCropper [cropperOptions]=\"config\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n <img [src]=\"imgwUrl\" />\r\n </div>\r\n <div class=\"cropper-btns\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"ZoomIn\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-plus\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"zoomImage(-0.1)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"ZoomOut\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-search-minus\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"moveImage(-10,0)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-left\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(10,0)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-right\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,-10)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveUp\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-up\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"moveImage(0,10)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"MoveDown\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-arrow-down\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"rotateImage(-45)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"RotateLeft\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-undo-alt\"></span>\r\n </span>\r\n </button>\r\n <button type=\"button\" (click)=\"rotateImage(45)\" class=\"btn btn-default\" ngbTooltip='{{UtilityService.getResourceValue(\"RotateRight\")}}'>\r\n <span class=\"docs-tooltip\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-sm btn-light\" (click)=\"openModal(false)\">\r\n {{UtilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-sm btn-brand\">\r\n {{UtilityService.getResourceValue(\"Crop\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- readonly -->\r\n\r\n\r\n</div>" }]
|
|
335
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
|
|
336
|
+
type: Optional
|
|
337
|
+
}] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }, { type: i5.NgbModal }], propDecorators: { fileInput: [{
|
|
338
|
+
type: ViewChild,
|
|
339
|
+
args: ['fileInput', { static: false }]
|
|
340
|
+
}], group: [{
|
|
341
|
+
type: Input
|
|
342
|
+
}], options: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}], OnChange: [{
|
|
345
|
+
type: Output
|
|
346
|
+
}], angularCropper: [{
|
|
347
|
+
type: ViewChild,
|
|
348
|
+
args: ['angularCropper', { static: false }]
|
|
349
|
+
}] } });
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZ2VVcGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL0ltYWdlVXBsb2FkL0ltYWdlVXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9JbWFnZVVwbG9hZC9JbWFnZVVwbG9hZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFDWCxVQUFVLEdBS1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBdUIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFnQnBGLE1BQU0sT0FBTyxzQkFBc0I7YUFDMUIsMkJBQXNCLEdBQUcsSUFBSSxBQUFQLENBQVE7SUErQnJDLFlBQ1UsSUFBWSxFQUNaLGNBQThCLEVBQ2xCLGdCQUFrQyxFQUMvQyx3QkFBNEMsRUFDNUMsY0FBOEIsRUFDN0Isd0JBQWtELEVBQ2xELGNBQThCLEVBQzlCLFlBQXNCO1FBUHRCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDbEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUMvQyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQW9CO1FBQzVDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM3Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBQ2xELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQXBDaEMs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QUFDO0lBQzdDLENBQUM7SUFDRCxTQUFTLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsU0FBUyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBYTtRQUNyQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDOzhHQS9XVSxzQkFBc0I7a0dBQXRCLHNCQUFzQixzVkNwQ25DLHd5UkFvSk07OzJGRGhITyxzQkFBc0I7a0JBSmxDLFNBQVM7K0JBQ0Usa0JBQWtCOzswQkFzQ3pCLFFBQVE7a01BaENnQyxTQUFTO3NCQUFuRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSWhDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFZQSxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPcHRpb25hbCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBOZ1pvbmUsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBGb3JtQ29udHJvbCxcclxuICBWYWxpZGF0b3JzLFxyXG4gIEZvcm1Hcm91cCxcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgQ29udHJvbENvbnRhaW5lcixcclxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb250cm9sVXRpbGl0eSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9Db250cm9sVXRpbGl0eSc7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRlciwgRmlsZUxpa2VPYmplY3QsIEZpbGVVcGxvYWRlck9wdGlvbnMgfSBmcm9tICduZzItZmlsZS11cGxvYWQnO1xyXG5pbXBvcnQgeyBGaWxlRFRPIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9GaWxlRFRPJztcclxuaW1wb3J0IHsgSW1hZ2VVcGxvYWRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9JbWFnZVVwbG9hZE9wdGlvbnMnO1xyXG5pbXBvcnQgeyBDcm9wcGVyQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhci1jcm9wcGVyanMnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICBVdGlsaXR5U2VydmljZSxcclxufSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9HbG9iYWxTZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1JbWFnZVVwbG9hZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL0ltYWdlVXBsb2FkLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEltYWdlVXBsb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyc3RhdGljID0gbnVsbDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcclxuICBmaWxlczogRmlsZVtdID0gW107XHJcbiAgSW1hZ2VTb3VyY2U6IHN0cmluZztcclxuICBpc1N1Ym1pdHRlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBncm91cDogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IEltYWdlVXBsb2FkT3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEltYWdlVXBsb2FkRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBWYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xyXG4gIHVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XHJcbiAgaGFzQW5vdGhlckRyb3Bab25lT3ZlcjogYm9vbGVhbjtcclxuICBBY2NlcHRlZFR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIEFjY2VwdGVkVHlwZUFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIFRvb2xUaXBUeXBlQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgRmlsZUxpa2VPYmplY3Q6IEZpbGVMaWtlT2JqZWN0O1xyXG4gIGNvbnRyb2w6IEZvcm1Db250cm9sO1xyXG4gIEBWaWV3Q2hpbGQoJ2FuZ3VsYXJDcm9wcGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXHJcbiAgcHVibGljIGFuZ3VsYXJDcm9wcGVyOiBDcm9wcGVyQ29tcG9uZW50O1xyXG4gIGltZ1VybCA9IG51bGw7XHJcbiAgY29uZmlnID0gbnVsbDtcclxuICBpbWFnZVVybCA9ICcnO1xyXG4gIGltZ3dVcmwgPSAnJztcclxuICBFdmVudEZpbGU6IGFueTtcclxuICBtZGxTYW1wbGVJc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtYXJrQWxsQXNUb3VjaGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdmFsaWRhdGlvblJ1bGVzID0gW107XHJcbiAgdmFsaWRhdGlvblJ1bGVzYXN5bmMgPSBbXTtcclxuICBtYXhGaWxlU2l6ZTogbnVtYmVyID0gMDtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksXHJcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBwdWJsaWMgSW1hZ2VVcGxhb2RlckNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgICBwdWJsaWMgVXRpbGl0eVNlcnZpY2U6IFV0aWxpdHlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsXHJcbiAgKSB7XHJcbiAgICBJbWFnZVVwbG9hZGVyQ29tcG9uZW50LmNvbnRyb2xDb250YWluZXJzdGF0aWMgPSB0aGlzLmNvbnRyb2xDb250YWluZXI7XHJcbiAgICB0aGlzLnVwbG9hZGVyID0gbmV3IEZpbGVVcGxvYWRlcig8RmlsZVVwbG9hZGVyT3B0aW9ucz57XHJcbiAgICAgIGRpc2FibGVNdWx0aXBhcnQ6IGZhbHNlLCAvLyAnRGlzYWJsZU11bHRpcGFydCcgbXVzdCBiZSAndHJ1ZScgZm9yIGZvcm1hdERhdGFGdW5jdGlvbiB0byBiZSBjYWxsZWQuXHJcbiAgICB9KTtcclxuICAgIHRoaXMuaGFzQW5vdGhlckRyb3Bab25lT3ZlciA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5pc0NyZWF0ZWRCZWZvciA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zLlZpZXdUeXBlKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuVmlld1R5cGUgPSB0aGlzLmdsb2JhbFNldHRpbmdzLlZpZXdUeXBlO1xyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zLkRlZmF1bHRJbWFnZVNyYylcclxuICAgICAgdGhpcy5vcHRpb25zLkRlZmF1bHRJbWFnZVNyYyA9IHRoaXMuZ2xvYmFsU2V0dGluZ3MuRGVmYXVsdEltYWdlU3JjO1xyXG5cclxuICAgIC8vU2V0IGltZyBzcmMgYnkgZGVmYXVsdCB2YWx1ZVxyXG4gICAgLy8gdGhpcy5JbWFnZVNvdXJjZSA9IHRoaXMub3B0aW9ucy5EZWZhdWx0SW1hZ2VTcmM7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BbGxvd0ltYWdlQ3JvcHBlcikge1xyXG4gICAgICB0aGlzLmNvbmZpZyA9IHtcclxuICAgICAgICBhc3BlY3RSYXRpbzpcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5JbWFnZUNyb3BwZXJXaWR0aCAvIHRoaXMub3B0aW9ucy5JbWFnZUNyb3BwZXJIZWlnaHQsXHJcbiAgICAgICAgZHJhZ01vZGU6ICdtb3ZlJyxcclxuICAgICAgICBiYWNrZ3JvdW5kOiB0cnVlLFxyXG4gICAgICAgIG1vdmFibGU6IHRydWUsXHJcbiAgICAgICAgcm90YXRhYmxlOiB0cnVlLFxyXG4gICAgICAgIHNjYWxhYmxlOiB0cnVlLFxyXG4gICAgICAgIHpvb21hYmxlOiB0cnVlLFxyXG4gICAgICAgIHZpZXdNb2RlOiAxLFxyXG4gICAgICAgIGNoZWNrSW1hZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgbW9kYWw6IHRydWUsXHJcbiAgICAgICAgY2hlY2tDcm9zc09yaWdpbjogZmFsc2UsXHJcbiAgICAgICAgd2lkdGg6IHRoaXMub3B0aW9ucy5JbWFnZUNyb3BwZXJXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IHRoaXMub3B0aW9ucy5JbWFnZUNyb3BwZXJIZWlnaHQsXHJcbiAgICAgICAgY3JvcEJveFJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgYXV0b0Nyb3A6IHRydWUsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXM7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLlZhbHVlICE9IG51bGwpIHtcclxuICAgICAgbGV0IGltZ1VSTCA9IHRoaXMub3B0aW9ucy5WYWx1ZVsnZmlsZVVSTCddO1xyXG4gICAgICBpZiAoaW1nVVJMICE9ICcnICYmIGltZ1VSTCAhPSB1bmRlZmluZWQgJiYgaW1nVVJMICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLkltYWdlU291cmNlID0gaW1nVVJMO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VVcmwgPSBpbWdVUkw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5vcHRpb25zLlZhbHVlO1xyXG4gICAgICB0aGlzLkZpbGVMaWtlT2JqZWN0ID0gbmV3IEZpbGVMaWtlT2JqZWN0KDxGaWxlPntcclxuICAgICAgICBuYW1lOiBlbGVtZW50LkZpbGVOYW1lLFxyXG4gICAgICAgIHNpemU6IGVsZW1lbnQuRmlsZVNpemVJbk1CICogMTAwMCAqIDEwMDAsXHJcbiAgICAgICAgdHlwZTogZWxlbWVudC5GaWxlVHlwZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudXBsb2FkZXIuYWRkVG9RdWV1ZShbdGhpcy5GaWxlTGlrZU9iamVjdCBhcyBhbnldKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQilcclxuICAgICAgdGhpcy5tYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBpbmRleCA8IHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aDtcclxuICAgICAgICBpbmRleCsrXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IFR5cGUgPSB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy5BY2NlcHRlZFR5cGUgPSB0aGlzLkFjY2VwdGVkVHlwZS50b1VwcGVyQ2FzZSgpICsgVHlwZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkgPSB0aGlzLkFjY2VwdGVkVHlwZS5zcGxpdCgnLCcpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5BY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5BY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgY29uc3QgVHlwZVRvb2xUaXBlID0gZWxlbWVudC5zcGxpdCgnLycpWzFdO1xyXG4gICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKFR5cGVUb29sVGlwZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlID1cclxuICAgICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlICtcclxuICAgICAgICB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0FsbG93ZWRUeXBlcycpICtcclxuICAgICAgICBgICgke3RoaXMuVG9vbFRpcFR5cGVBcnJheX0pIGA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiA+IDApIHtcclxuICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSA9XHJcbiAgICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSArXHJcbiAgICAgICAgYCA8YnIgLz4gJHt0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoJ0ZpbGVNYXhTaXplSW5NQicpfSAke3RoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUJcclxuICAgICAgICB9YDtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMuTmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuVmFsdWUgIT0gbnVsbClcclxuICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKHRoaXMub3B0aW9ucy5WYWx1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSAnJylcclxuICAgICAgdGhpcy5vcHRpb25zLkxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXHJcbiAgICAgICAgdGhpcy5vcHRpb25zLkxhYmVsS2V5XHJcbiAgICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb247XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5JbWFnZVVwbGFvZGVyQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS5LZXksXHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNob3dJbWFnZVVwbG9hZGVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICBsZXQgaW5wdXQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAnaW5wdXRbdHlwZT1maWxlXSdcclxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRFcnJvciA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLnJlbW92ZUdsb2JhbEVycm9yKCk7XHJcbiAgfTtcclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKCk7XHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoXHJcbiAgICAgIEVycm9yTGlzdCxcclxuICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgdGhpcy5vcHRpb25zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25GaWxlQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQucmVqZWN0ZWRGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5yZWplY3RlZEZpbGVzWzBdO1xyXG4gICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlLnR5cGU7XHJcbiAgICAgIGlmIChmaWxlLnNpemUgPiBtYXhGaWxlU2l6ZSkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7XHJcbiAgICAgICAgICBGaWxlTWF4U2l6ZUluTUI6IHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUIgKyAnTScsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMudXBsb2FkZXIucXVldWUgPSBbXTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiZcclxuICAgICAgICB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgIShcclxuICAgICAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkuaW5jbHVkZXMoZmlsZVR5cGUudG9VcHBlckNhc2UoKSkgfHxcclxuICAgICAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkuaW5jbHVkZXMoZmlsZVR5cGUudG9Mb3dlckNhc2UoKSlcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7IFRvb2xUaXBUeXBlRXJyb3I6IHRoaXMuVG9vbFRpcFR5cGVBcnJheSB9KTtcclxuICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IEZpbGVzQXJyYXkgPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBldmVudC5hZGRlZEZpbGVzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBmaWxlID0gZXZlbnQuYWRkZWRGaWxlc1swXTtcclxuICAgICAgdGhpcy5FdmVudEZpbGUgPSBmaWxlO1xyXG4gICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCBtYXhGaWxlU2l6ZSA9IHRoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUIgKiAxMDAwICogMTAwMDtcclxuICAgICAgICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZTtcclxuICAgICAgICBpZiAoZmlsZS5zaXplID4gbWF4RmlsZVNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcclxuICAgICAgICAgICAgRmlsZU1heFNpemVJbk1COiB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICsgJ00nLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIGxldCBGaWxlT2JqZWN0ID0gZmlsZTtcclxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChGaWxlT2JqZWN0KTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5BbGxvd0ltYWdlQ3JvcHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLmltYWdlVXJsID0gcmVhZGVyLnJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5Nb2RhbCh0cnVlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBGaWxlT2JqZWN0OiBGaWxlRFRPID0ge1xyXG4gICAgICAgICAgICAgIEZpbGVOYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgICAgICAgICAgRmlsZVR5cGU6IGZpbGUudHlwZSxcclxuICAgICAgICAgICAgICBGaWxlQmFzZTY0OiByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSxcclxuICAgICAgICAgICAgICBGaWxlU2l6ZUluTUI6IGZpbGUuc2l6ZSAvIDEwMDAgLyAxMDAwLFxyXG4gICAgICAgICAgICAgIE5hbWVXaXRoRXh0ZW5zaW9uOiBmaWxlLm5hbWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IEZpbGVPYmplY3Q7XHJcbiAgICAgICAgICAgIEZpbGVzQXJyYXkucHVzaChGaWxlT2JqZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKEZpbGVPYmplY3QpO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaCguLi5ldmVudC5hZGRlZEZpbGVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuUGF0Y2hGdW5jdGlvbiAmJlxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoICYmXHJcbiAgICAgICAgICAgIHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC52YWxpZFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0Y2hDb250cm9sVmFsdWUoXHJcbiAgICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZSxcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuUGF0Y2hGdW5jdGlvbixcclxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IG9yaWdpbmFsVmFsdWU7XHJcbiAgICAgICAgICB0aGlzLk9uQ2hhbmdlLmVtaXQob3JpZ2luYWxWYWx1ZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShldmVudCkge1xyXG4gICAgbGV0IEl0ZW1MaXN0ID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlO1xyXG4gICAgdGhpcy5maWxlcyA9IFtdO1xyXG4gICAgSXRlbUxpc3QgPSBudWxsO1xyXG4gICAgLy9TZXQgSW1nIHNyYyBieSBkZWZhdWx0IGltYWdlICh1cGxvYWQpXHJcbiAgICB0aGlzLkltYWdlU291cmNlID0gdGhpcy5vcHRpb25zLkRlZmF1bHRJbWFnZVNyYztcclxuXHJcbiAgICBpZiAodGhpcy5maWxlcy5sZW5ndGggPT0gMCAmJiB0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wuc2V0RXJyb3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZDtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS5zZXRWYWx1ZShJdGVtTGlzdCk7XHJcbiAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlKTtcclxuICAgIC8vVXNlIHRoaXMgbGluZSB0byBlbmFibGUgdHdvIHdheSBiaW5kaW5nLlxyXG4gICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY3JvcEltYWdlKCkge1xyXG4gICAgbGV0IEltYWdlQ3JvcHBlck9iamVjdCA9IHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKHtcclxuICAgICAgd2lkdGg6IHRoaXMub3B0aW9ucy5JbWFnZUNyb3BwZXJXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuSW1hZ2VDcm9wcGVySGVpZ2h0LFxyXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICBpbWFnZVNtb290aGluZ1F1YWxpdHk6ICdoaWdoJyxcclxuICAgIH0pO1xyXG4gICAgSW1hZ2VDcm9wcGVyT2JqZWN0LnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdldEJsb2JGaWxlKGJsb2IpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmxvYkZpbGUoYmxvYikge1xyXG4gICAgbGV0IEZpbGVzQXJyYXkgPSBbXTtcclxuICAgIGxldCBCbG9iRmlsZTtcclxuICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgQmxvYkZpbGUgPSBibG9iO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoQmxvYkZpbGUpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgbGV0IEZpbGVPYmplY3Q6IEZpbGVEVE8gPSB7XHJcbiAgICAgICAgRmlsZU5hbWU6IHRoaXMuRXZlbnRGaWxlLm5hbWUsXHJcbiAgICAgICAgRmlsZVR5cGU6IHRoaXMuRXZlbnRGaWxlLnR5cGUsXHJcbiAgICAgICAgRmlsZUJhc2U2NDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLnNwbGl0KCcsJylbMV0sXHJcbiAgICAgICAgRmlsZVNpemVJbk1COiBCbG9iRmlsZS5zaXplIC8gMTAwMCAvIDEwMDAsXHJcbiAgICAgICAgTmFtZVdpdGhFeHRlbnNpb246IHRoaXMuRXZlbnRGaWxlLm5hbWUsXHJcbiAgICAgIH07XHJcbiAgICAgIEJsb2JGaWxlLm5hbWUgPSB0aGlzLkV2ZW50RmlsZS5uYW1lO1xyXG5cclxuICAgICAgRmlsZXNBcnJheS5wdXNoKEZpbGVPYmplY3QpO1xyXG4gICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUoRmlsZU9iamVjdCk7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IEZpbGVPYmplY3Q7XHJcbiAgICAgIHRoaXMuZmlsZXMgPSBbXTtcclxuICAgICAgdGhpcy5maWxlcy5wdXNoKEJsb2JGaWxlKTtcclxuICAgICAgdGhpcy5vcGVuTW9kYWwoZmFsc2UpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZUltYWdlKGRlZ3JlZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIucm90YXRlKGRlZ3JlZSk7XHJcbiAgfVxyXG4gIG1vdmVJbWFnZShvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcikge1xyXG4gICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLm1vdmUob2Zmc2V0WCwgb2Zmc2V0WSk7XHJcbiAgfVxyXG4gIHpvb21JbWFnZShyYXRpbzogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuem9vbShyYXRpbyk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9kYWwob3BlbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5tZGxTYW1wbGVJc09wZW4gPSBvcGVuO1xyXG4gIH1cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuXHJcbiAgUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIHRoaXMub3B0aW9uc1xyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcblxyXG4gIEFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkUmVxdWlyZWRWYWxpZGF0aW9uKFxyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wsXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLFxyXG4gICAgICB0aGlzLm9wdGlvbnNcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbihcclxuICAgICAgdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLFxyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcyxcclxuICAgICAgQ3VzdG9tVmFsaWRhdGlvblxyXG4gICAgKTtcclxuICB9O1xyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZEN1c3RvbVZhbGlkYXRpb24oXHJcbiAgICAgIHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCxcclxuICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMsXHJcbiAgICAgIEN1c3RvbVZhbGlkYXRpb25cclxuICAgICk7XHJcbiAgfTtcclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LklzVmFsaWQodGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sKTtcclxuICB9O1xyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGJic2YtY29udHJvbCBiYnNmLWltYWdlLXVwbG9hZFwiIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cIihvcHRpb25zLlZpZXdUeXBlPT0xKT8nYmJzZi12ZXJ0aWNhbCc6J2Jic2YtaG9yaXpvbnRhbCdcIj5cclxuICAgIDwhLS1sYWJlbC0tPlxyXG4gICAgPGxhYmVsIFtoaWRkZW5dPVwib3B0aW9ucy5IaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLkxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAge3tvcHRpb25zLkxhYmVsVmFsdWV9fVxyXG4gICAgICA8IS0tQXN0ZXJpc2stLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuU2hvd0FzdGVyaXNrJiZvcHRpb25zLklzUmVxdWlyZWQpfHwob3B0aW9ucy5Jc1JlcXVpcmVkKSkmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8IS0tQWxsb3cgZHJvcFpvbmUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLkFsbG93RHJvcFpvbmUmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cImJic2YtaW5wdXQtY29udGFpbmVyIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiIG5neC1kcm9wem9uZVxyXG4gICAgICBbZGlzYWJsZWRdPVwib3B0aW9ucy5Jc0Rpc2FibGVkXCIgW2FjY2VwdF09XCJBY2NlcHRlZFR5cGVcIiBbbXVsdGlwbGVdPVwib3B0aW9ucy5Jc011bHRpcGxlXCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiIG5nRGVmYXVsdENvbnRyb2xcclxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tvcHRpb25zLk5hbWV9fVwiIFttYXhGaWxlU2l6ZV09XCJtYXhGaWxlU2l6ZVwiIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiXHJcbiAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIkltYWdlVXBsb2FkRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBJbWFnZVVwbG9hZEZvcm1Db250cm9sLnRvdWNoZWRcIj5cclxuICAgICAgPG5neC1kcm9wem9uZS1sYWJlbCBjbGFzcz1cImRyb3B6b25lLWxhYmVsXCI+XHJcbiAgICAgICAgPGltZyAqbmdJZj1cIkltYWdlU291cmNlXCIgW3NyY109XCJJbWFnZVNvdXJjZVwiXHJcbiAgICAgICAgICBzdHlsZT1cImFsaWduLWl0ZW1zOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogNXB4O2Rpc3BsYXk6IGZsZXg7aGVpZ2h0OiAxMDBweDtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjttYXJnaW46IDEwcHg7bWF4LXdpZHRoOiAxODBweDttaW4taGVpZ2h0OiAxMDBweDttaW4td2lkdGg6IDE4MHB4O3BhZGRpbmc6IDBweCAyMHB4O3Bvc2l0aW9uOiByZWxhdGl2ZTtcIiAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdmctYW5kLXZhbGlkYXRpb25cIiAqbmdJZj1cIiFJbWFnZVNvdXJjZVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4O1wiPlxyXG4gICAgICAgICAgICA8cGF0aCBvcGFjaXR5PVwiMC4zXCJcclxuICAgICAgICAgICAgICBkPVwiTTUgMTZDMy4zIDE2IDIgMTQuNyAyIDEzQzIgMTEuMyAzLjMgMTAgNSAxMEg1LjFDNSA5LjcgNSA5LjMgNSA5QzUgNi4yIDcuMiA0IDEwIDRDMTEuOSA0IDEzLjUgNSAxNC4zIDYuNUMxNC44IDYuMiAxNS40IDYgMTYgNkMxNy43IDYgMTkgNy4zIDE5IDlDMTkgOS40IDE4LjkgOS43IDE4LjggMTBDMTguOSAxMCAxOC45IDEwIDE5IDEwQzIwLjcgMTAgMjIgMTEuMyAyMiAxM0MyMiAxNC43IDIwLjcgMTYgMTkgMTZINVpNOCAxMy42SDE2TDEyLjcgMTAuM0MxMi4zIDkuODk5OTkgMTEuNyA5Ljg5OTk5IDExLjMgMTAuM0w4IDEzLjZaXCJcclxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjYTFhMWExO1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMSAxMy42VjE5QzExIDE5LjYgMTEuNCAyMCAxMiAyMEMxMi42IDIwIDEzIDE5LjYgMTMgMTlWMTMuNkgxMVpcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgc3R5bGU9XCJmaWxsOiAjOTg5ODk4O1wiPjwvcGF0aD5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPCEtLVZhbGlkYXRpb24gdGV4dC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvbi1tc2dcIiAqbmdJZj1cIlZhbGlkYXRpb25NZXNzYWdlXCIgW2lubmVySFRNTF09XCJWYWxpZGF0aW9uTWVzc2FnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25neC1kcm9wem9uZS1sYWJlbD5cclxuICAgICAgPG5neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3IGNsYXNzPVwiZHJvcHpvbmUtcHJldmlld1wiICpuZ0Zvcj1cImxldCBmIG9mIGZpbGVzXCIgW2ZpbGVdPVwiZlwiIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmVkKT1cInJlbW92ZUZyb21Db250cm9sVmFsdWUoZilcIlxyXG4gICAgICAgIG5nUHJvamVjdEFzPVwibmd4LWRyb3B6b25lLXByZXZpZXdcIj5cclxuICAgICAgPC9uZ3gtZHJvcHpvbmUtaW1hZ2UtcHJldmlldz5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLU5vdCBhbGxvd2VkIGRyb3Bab25lLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIW9wdGlvbnMuQWxsb3dEcm9wWm9uZSYmIW9wdGlvbnMuSXNSZWFkb25seVwiPlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWxhYmVsICpuZ0lmPVwiZmlsZXMubGVuZ3RoPT0wXCI+XHJcbiAgICAgICAgPGRpdiAjZWxlbWVudCAoY2xpY2spPVwic2hvd0ltYWdlVXBsb2FkZXIoZWxlbWVudClcIj5cclxuICAgICAgICAgIDxpbWcgW3NyY109XCJJbWFnZVNvdXJjZVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1ub25lIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiIG5neC1kcm9wem9uZSBbZGlzYWJsZWRdPVwib3B0aW9ucy5Jc0Rpc2FibGVkXCIgW2FjY2VwdF09XCJBY2NlcHRlZFR5cGVcIlxyXG4gICAgICAgIFttdWx0aXBsZV09XCJvcHRpb25zLklzTXVsdGlwbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCIgbmdEZWZhdWx0Q29udHJvbCBmb3JtQ29udHJvbE5hbWU9XCJ7e29wdGlvbnMuTmFtZX19XCJcclxuICAgICAgICBbbWF4RmlsZVNpemVdPVwibWF4RmlsZVNpemVcIiBpZD1cInt7b3B0aW9ucy5OYW1lfX1cIiBbY2xhc3MuaXMtaW52YWxpZF09XCJJbWFnZVVwbG9hZEZvcm1Db250cm9sLmludmFsaWQgJiYgSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC50b3VjaGVkXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmd4LWRyb3B6b25lLWltYWdlLXByZXZpZXcgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIiBbZmlsZV09XCJmXCIgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwicmVtb3ZlRnJvbUNvbnRyb2xWYWx1ZShmKVwiXHJcbiAgICAgICAgbmdQcm9qZWN0QXM9XCJuZ3gtZHJvcHpvbmUtcHJldmlld1wiPlxyXG4gICAgICA8L25neC1kcm9wem9uZS1pbWFnZS1wcmV2aWV3PlxyXG4gICAgICA8IS0tVmFsaWRhdGlvbiB0ZXh0LS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLXZhbGlkYXRpb24tbXNnXCIgKm5nSWY9XCJWYWxpZGF0aW9uTWVzc2FnZVwiIFtpbm5lckhUTUxdPVwiVmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZ3gtZHJvcHpvbmUtbGFiZWwgKm5nSWY9XCJmaWxlcy5sZW5ndGg9PTAmJm9wdGlvbnMuSXNSZWFkb25seVwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiSW1hZ2VTb3VyY2VcIiAjZWxlbWVudD5cclxuICAgICAgICA8aW1nIFtzcmNdPVwiSW1hZ2VTb3VyY2VcIiAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFJbWFnZVNvdXJjZVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmlld1wiPnt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnTkEnKX19PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmd4LWRyb3B6b25lLWxhYmVsPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJzdWJ0ZXh0LWNvbnRhaW5lclwiICpuZ0lmPVwiIW9wdGlvbnMuSXNSZWFkb25seVwiPlxyXG4gICAgPCEtLSByZXF1aXJlZCB0ZXh0LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCIgKm5nSWY9XCIoSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkICYmIEltYWdlVXBsb2FkRm9ybUNvbnRyb2wudG91Y2hlZClcIj5cclxuICAgICAge3tnZXRFcnJvclZhbGlkYXRpb24oSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5lcnJvcnN8a2V5dmFsdWUpfX1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gTGFiZWxEZXNjcmlwdGlvbi0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImJic2YtY29udHJvbC1kZXNjXCIgKm5nSWY9XCJvcHRpb25zLkxhYmVsRGVzY3JpcHRpb24hPW51bGxcIj57e29wdGlvbnMuTGFiZWxEZXNjcmlwdGlvbn19PC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiKGdyb3VwLnZhbGlkJiZncm91cC5kaXJ0eSYmZ3JvdXAudG91Y2hlZCApfHwoZ3JvdXAudW50b3VjaGVkJiZncm91cC5pbnZhbGlkJiZncm91cC5kaXJ0eSkgXCI+e3tyZXNldEVycm9yKCl9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gaW1hZ2UgY3JvcHBlciBtb2RhbC0tPlxyXG4gIDxkaXYgaWQ9XCJtZGxTYW1wbGVcIiBjbGFzcz1cIm1vZGFsIGJic2YtY3JvcHBlci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiBtZGxTYW1wbGVJc09wZW4gPyAnYmxvY2snIDogJ25vbmUnLCAnb3BhY2l0eSc6IDF9XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cclxuICAgICAgICAgICAge3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ3JvcEltYWdlXCIpfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgKGNsaWNrKT1cIm9wZW5Nb2RhbChmYWxzZSlcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImltYWdlVXJsXCI+XHJcbiAgICAgICAgICAgIDxhbmd1bGFyLWNyb3BwZXIgI2FuZ3VsYXJDcm9wcGVyIFtjcm9wcGVyT3B0aW9uc109XCJjb25maWdcIiBbaW1hZ2VVcmxdPVwiaW1hZ2VVcmxcIj5cclxuICAgICAgICAgICAgPC9hbmd1bGFyLWNyb3BwZXI+XHJcbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJpbWd3VXJsXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3BwZXItYnRuc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInpvb21JbWFnZSgwLjEpXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPSd7e1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJab29tSW5cIil9fSc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNlYXJjaC1wbHVzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJ6b29tSW1hZ2UoLTAuMSlcIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIG5nYlRvb2x0aXA9J3t7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlpvb21PdXRcIil9fSc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXNlYXJjaC1taW51c1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKC0xMCwwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD0ne3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTW92ZUxlZnRcIil9fSc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWFycm93LWxlZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vdmVJbWFnZSgxMCwwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD0ne3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTW92ZVJpZ2h0XCIpfX0nPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy1yaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKDAsLTEwKVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD0ne3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTW92ZVVwXCIpfX0nPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2NzLXRvb2x0aXBcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibW92ZUltYWdlKDAsMTApXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBuZ2JUb29sdGlwPSd7e1V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJNb3ZlRG93blwiKX19Jz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicm90YXRlSW1hZ2UoLTQ1KVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD0ne3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUm90YXRlTGVmdFwiKX19Jz5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jcy10b29sdGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdW5kby1hbHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJvdGF0ZUltYWdlKDQ1KVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgbmdiVG9vbHRpcD0ne3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUm90YXRlUmlnaHRcIil9fSc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvY3MtdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXJlZG8tYWx0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIiBhbGlnbj1cInJpZ2h0XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJ0bkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1saWdodFwiIChjbGljayk9XCJvcGVuTW9kYWwoZmFsc2UpXCI+XHJcbiAgICAgICAgICAgIHt7VXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNyb3BJbWFnZSgpXCIgaWQ9XCJidG5PS1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tYnJhbmRcIj5cclxuICAgICAgICAgICAge3tVdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ3JvcFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSByZWFkb25seSAtLT5cclxuXHJcblxyXG48L2Rpdj4iXX0=
|