@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.
Files changed (193) hide show
  1. package/README.md +24 -0
  2. package/bnsights-bbsf-controls.d.ts +26 -0
  3. package/bnsights-bbsf-controls.metadata.json +1 -0
  4. package/bundles/bnsights-bbsf-controls.umd.js +6375 -0
  5. package/bundles/bnsights-bbsf-controls.umd.js.map +1 -0
  6. package/esm2015/bnsights-bbsf-controls.js +27 -0
  7. package/esm2015/lib/Shared/Enums/CalendarView.js +8 -0
  8. package/esm2015/lib/Shared/Enums/ControlLayout.js +6 -0
  9. package/esm2015/lib/Shared/Enums/Countries.js +247 -0
  10. package/esm2015/lib/Shared/Enums/FileType.js +22 -0
  11. package/esm2015/lib/Shared/Enums/FilterType.js +11 -0
  12. package/esm2015/lib/Shared/Enums/FontSize.js +7 -0
  13. package/esm2015/lib/Shared/Enums/ForceDirection.js +6 -0
  14. package/esm2015/lib/Shared/Enums/IconPosition.js +6 -0
  15. package/esm2015/lib/Shared/Enums/ImageType.js +10 -0
  16. package/esm2015/lib/Shared/Enums/InputType.js +9 -0
  17. package/esm2015/lib/Shared/Enums/Insert.js +9 -0
  18. package/esm2015/lib/Shared/Enums/LanguageMode.js +11 -0
  19. package/esm2015/lib/Shared/Enums/Misc.js +7 -0
  20. package/esm2015/lib/Shared/Enums/PagingActionMode.js +6 -0
  21. package/esm2015/lib/Shared/Enums/Para.js +9 -0
  22. package/esm2015/lib/Shared/Enums/PickerType.js +7 -0
  23. package/esm2015/lib/Shared/Enums/SelectMode.js +6 -0
  24. package/esm2015/lib/Shared/Enums/StartView.js +7 -0
  25. package/esm2015/lib/Shared/Enums/Style.js +8 -0
  26. package/esm2015/lib/Shared/Enums/menu-list-enum.js +6 -0
  27. package/esm2015/lib/Shared/Models/Attribute.js +3 -0
  28. package/esm2015/lib/Shared/Models/AutocompleteDTO.js +7 -0
  29. package/esm2015/lib/Shared/Models/AutocompleteOptions.js +29 -0
  30. package/esm2015/lib/Shared/Models/CalendarEventDTO.js +3 -0
  31. package/esm2015/lib/Shared/Models/CalendarOptions.js +17 -0
  32. package/esm2015/lib/Shared/Models/CancelDTO.js +7 -0
  33. package/esm2015/lib/Shared/Models/CheckBoxOptions.js +12 -0
  34. package/esm2015/lib/Shared/Models/CustomValidation.js +14 -0
  35. package/esm2015/lib/Shared/Models/DropdownListItem.js +3 -0
  36. package/esm2015/lib/Shared/Models/DropdownOptions.js +18 -0
  37. package/esm2015/lib/Shared/Models/EditPersonalImage.js +7 -0
  38. package/esm2015/lib/Shared/Models/EnglishArabicDTO.js +3 -0
  39. package/esm2015/lib/Shared/Models/FileDTO.js +2 -0
  40. package/esm2015/lib/Shared/Models/FileUploadModel.js +3 -0
  41. package/esm2015/lib/Shared/Models/FileUploadOptions.js +15 -0
  42. package/esm2015/lib/Shared/Models/FilterItem.js +8 -0
  43. package/esm2015/lib/Shared/Models/FormOptions.js +26 -0
  44. package/esm2015/lib/Shared/Models/HtmlEditorOptions.js +16 -0
  45. package/esm2015/lib/Shared/Models/ImageUploadOptions.js +18 -0
  46. package/esm2015/lib/Shared/Models/MapAutoCompleteOptions.js +11 -0
  47. package/esm2015/lib/Shared/Models/MapAutocompleteDTO.js +3 -0
  48. package/esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js +19 -0
  49. package/esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js +19 -0
  50. package/esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js +22 -0
  51. package/esm2015/lib/Shared/Models/MultipleFileUploadModel.js +9 -0
  52. package/esm2015/lib/Shared/Models/PagingDTO.js +13 -0
  53. package/esm2015/lib/Shared/Models/PagingOptions.js +43 -0
  54. package/esm2015/lib/Shared/Models/PhoneOptions.js +15 -0
  55. package/esm2015/lib/Shared/Models/ProfileImageUploadOptions.js +15 -0
  56. package/esm2015/lib/Shared/Models/ProfilePictureDTO.js +3 -0
  57. package/esm2015/lib/Shared/Models/RadioButtonItem.js +3 -0
  58. package/esm2015/lib/Shared/Models/RadioButtonOptions.js +10 -0
  59. package/esm2015/lib/Shared/Models/RangeNumber.js +3 -0
  60. package/esm2015/lib/Shared/Models/SaveDTO.js +7 -0
  61. package/esm2015/lib/Shared/Models/TagsInputDTO.js +3 -0
  62. package/esm2015/lib/Shared/Models/TagsInputOptions.js +45 -0
  63. package/esm2015/lib/Shared/Models/TextAreaOptions.js +14 -0
  64. package/esm2015/lib/Shared/Models/TextBoxOptions.js +21 -0
  65. package/esm2015/lib/Shared/Models/ToggleslideOptions.js +9 -0
  66. package/esm2015/lib/Shared/Models/UploadPersonalImage.js +7 -0
  67. package/esm2015/lib/Shared/Models/datePickerOptions.js +24 -0
  68. package/esm2015/lib/Shared/config/environment.js +12 -0
  69. package/esm2015/lib/Shared/services/ControlUtility.js +114 -0
  70. package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +22 -0
  71. package/esm2015/lib/Shared/services/validationErrorMassage.service.js +122 -0
  72. package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +236 -0
  73. package/esm2015/lib/controls/Calendar/Calendar.component.js +176 -0
  74. package/esm2015/lib/controls/CheckBox/CheckBox.component.js +111 -0
  75. package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +148 -0
  76. package/esm2015/lib/controls/DropdownList/DropdownList.component.js +172 -0
  77. package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +319 -0
  78. package/esm2015/lib/controls/Form/Form.component.js +82 -0
  79. package/esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js +202 -0
  80. package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +304 -0
  81. package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +283 -0
  82. package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +383 -0
  83. package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +325 -0
  84. package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +326 -0
  85. package/esm2015/lib/controls/Paging/JwPagination.component.js +127 -0
  86. package/esm2015/lib/controls/Paging/Paging.component.js +215 -0
  87. package/esm2015/lib/controls/Phone/Phone.component.js +114 -0
  88. package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +326 -0
  89. package/esm2015/lib/controls/RadioButton/RadioButton.component.js +98 -0
  90. package/esm2015/lib/controls/TagsInput/TagsInput.component.js +205 -0
  91. package/esm2015/lib/controls/TextArea/TextArea.component.js +148 -0
  92. package/esm2015/lib/controls/TextBox/TextBox.component.js +217 -0
  93. package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +71 -0
  94. package/esm2015/lib/controls/bbsf-controls.module.js +208 -0
  95. package/esm2015/public-api.js +101 -0
  96. package/fesm2015/bnsights-bbsf-controls.js +5794 -0
  97. package/fesm2015/bnsights-bbsf-controls.js.map +1 -0
  98. package/lib/Shared/Enums/CalendarView.d.ts +6 -0
  99. package/lib/Shared/Enums/ControlLayout.d.ts +4 -0
  100. package/lib/Shared/Enums/Countries.d.ts +245 -0
  101. package/lib/Shared/Enums/FileType.d.ts +20 -0
  102. package/lib/Shared/Enums/FilterType.d.ts +9 -0
  103. package/lib/Shared/Enums/FontSize.d.ts +5 -0
  104. package/lib/Shared/Enums/ForceDirection.d.ts +4 -0
  105. package/lib/Shared/Enums/IconPosition.d.ts +4 -0
  106. package/lib/Shared/Enums/ImageType.d.ts +8 -0
  107. package/lib/Shared/Enums/InputType.d.ts +7 -0
  108. package/lib/Shared/Enums/Insert.d.ts +7 -0
  109. package/lib/Shared/Enums/LanguageMode.d.ts +9 -0
  110. package/lib/Shared/Enums/Misc.d.ts +5 -0
  111. package/lib/Shared/Enums/PagingActionMode.d.ts +4 -0
  112. package/lib/Shared/Enums/Para.d.ts +7 -0
  113. package/lib/Shared/Enums/PickerType.d.ts +5 -0
  114. package/lib/Shared/Enums/SelectMode.d.ts +4 -0
  115. package/lib/Shared/Enums/StartView.d.ts +5 -0
  116. package/lib/Shared/Enums/Style.d.ts +6 -0
  117. package/lib/Shared/Enums/menu-list-enum.d.ts +4 -0
  118. package/lib/Shared/Models/Attribute.d.ts +4 -0
  119. package/lib/Shared/Models/AutocompleteDTO.d.ts +4 -0
  120. package/lib/Shared/Models/AutocompleteOptions.d.ts +74 -0
  121. package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -0
  122. package/lib/Shared/Models/CalendarOptions.d.ts +29 -0
  123. package/lib/Shared/Models/CancelDTO.d.ts +5 -0
  124. package/lib/Shared/Models/CheckBoxOptions.d.ts +38 -0
  125. package/lib/Shared/Models/CustomValidation.d.ts +10 -0
  126. package/lib/Shared/Models/DropdownListItem.d.ts +4 -0
  127. package/lib/Shared/Models/DropdownOptions.d.ts +67 -0
  128. package/lib/Shared/Models/EditPersonalImage.d.ts +5 -0
  129. package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -0
  130. package/lib/Shared/Models/FileDTO.d.ts +19 -0
  131. package/lib/Shared/Models/FileUploadModel.d.ts +4 -0
  132. package/lib/Shared/Models/FileUploadOptions.d.ts +56 -0
  133. package/lib/Shared/Models/FilterItem.d.ts +13 -0
  134. package/lib/Shared/Models/FormOptions.d.ts +15 -0
  135. package/lib/Shared/Models/HtmlEditorOptions.d.ts +66 -0
  136. package/lib/Shared/Models/ImageUploadOptions.d.ts +59 -0
  137. package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +44 -0
  138. package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -0
  139. package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +97 -0
  140. package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +85 -0
  141. package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +83 -0
  142. package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -0
  143. package/lib/Shared/Models/PagingDTO.d.ts +11 -0
  144. package/lib/Shared/Models/PagingOptions.d.ts +51 -0
  145. package/lib/Shared/Models/PhoneOptions.d.ts +56 -0
  146. package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +64 -0
  147. package/lib/Shared/Models/ProfilePictureDTO.d.ts +12 -0
  148. package/lib/Shared/Models/RadioButtonItem.d.ts +4 -0
  149. package/lib/Shared/Models/RadioButtonOptions.d.ts +44 -0
  150. package/lib/Shared/Models/RangeNumber.d.ts +4 -0
  151. package/lib/Shared/Models/SaveDTO.d.ts +5 -0
  152. package/lib/Shared/Models/TagsInputDTO.d.ts +4 -0
  153. package/lib/Shared/Models/TagsInputOptions.d.ts +91 -0
  154. package/lib/Shared/Models/TextAreaOptions.d.ts +60 -0
  155. package/lib/Shared/Models/TextBoxOptions.d.ts +70 -0
  156. package/lib/Shared/Models/ToggleslideOptions.d.ts +36 -0
  157. package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -0
  158. package/lib/Shared/Models/datePickerOptions.d.ts +65 -0
  159. package/lib/Shared/config/environment.d.ts +1 -0
  160. package/lib/Shared/services/ControlUtility.d.ts +23 -0
  161. package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +7 -0
  162. package/lib/Shared/services/validationErrorMassage.service.d.ts +13 -0
  163. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +51 -0
  164. package/lib/controls/Calendar/Calendar.component.d.ts +40 -0
  165. package/lib/controls/CheckBox/CheckBox.component.d.ts +33 -0
  166. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +41 -0
  167. package/lib/controls/DropdownList/DropdownList.component.d.ts +47 -0
  168. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +49 -0
  169. package/lib/controls/Form/Form.component.d.ts +15 -0
  170. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +44 -0
  171. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +64 -0
  172. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +52 -0
  173. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +58 -0
  174. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +59 -0
  175. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +57 -0
  176. package/lib/controls/Paging/JwPagination.component.d.ts +24 -0
  177. package/lib/controls/Paging/Paging.component.d.ts +44 -0
  178. package/lib/controls/Phone/Phone.component.d.ts +37 -0
  179. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +65 -0
  180. package/lib/controls/RadioButton/RadioButton.component.d.ts +31 -0
  181. package/lib/controls/TagsInput/TagsInput.component.d.ts +47 -0
  182. package/lib/controls/TextArea/TextArea.component.d.ts +41 -0
  183. package/lib/controls/TextBox/TextBox.component.d.ts +50 -0
  184. package/lib/controls/Toggleslide/toggleslide.component.d.ts +26 -0
  185. package/lib/controls/bbsf-controls.module.d.ts +10 -0
  186. package/package.json +85 -0
  187. package/public-api.d.ts +66 -0
  188. package/src/lib/assets/Style.css +1149 -0
  189. package/src/lib/assets/i18n/ar.json +29 -0
  190. package/src/lib/assets/i18n/en.json +24 -0
  191. package/src/lib/assets/images/imagenotfound.png +0 -0
  192. package/src/lib/assets/images/uploadimg.png +0 -0
  193. package/src/lib/assets/images/userimg.png +0 -0
@@ -0,0 +1,202 @@
1
+ import { Component, Input, Optional, NgZone, Output, EventEmitter } from '@angular/core';
2
+ import { FormControl, Validators, ControlContainer, FormGroupDirective } from '@angular/forms';
3
+ import { ControlUtility } from '../../Shared/services/ControlUtility';
4
+ import { BBSFTranslateService, ControlValidationService, UtilityService } from '@bnsights/bbsf-utilities';
5
+ export class HtmlEditorComponent {
6
+ constructor(zone, controlUtility, controlContainer, HtmlEditorControlHost, UtilityService, translate, controlValidationService) {
7
+ this.zone = zone;
8
+ this.controlUtility = controlUtility;
9
+ this.controlContainer = controlContainer;
10
+ this.HtmlEditorControlHost = HtmlEditorControlHost;
11
+ this.UtilityService = UtilityService;
12
+ this.translate = translate;
13
+ this.controlValidationService = controlValidationService;
14
+ this.OnChange = new EventEmitter();
15
+ this.WordCount = 0;
16
+ this.WordCountArray = 0;
17
+ this.markAllAsTouched = false;
18
+ this.validationRules = [];
19
+ this.validationRulesasync = [];
20
+ this.resetError = () => {
21
+ this.controlValidationService.RemoveGlobalError();
22
+ };
23
+ //External Method
24
+ this.RemoveRequiredValidation = () => {
25
+ this.controlUtility.RemoveRequiredValidation(this.HtmlEditorFormControl, this.validationRules, this.options);
26
+ };
27
+ //External Method
28
+ this.AddRequiredValidation = () => {
29
+ this.controlUtility.AddRequiredValidation(this.HtmlEditorFormControl, this.validationRules, this.options);
30
+ };
31
+ //External Method
32
+ this.RemoveCustomValidation = (CustomValidation) => {
33
+ this.controlUtility.RemoveCustomValidation(this.HtmlEditorFormControl, this.validationRules, CustomValidation);
34
+ };
35
+ //External Method
36
+ this.AddCustomValidation = (CustomValidation) => {
37
+ this.controlUtility.AddCustomValidation(this.HtmlEditorFormControl, this.validationRules, CustomValidation);
38
+ };
39
+ //External Method
40
+ this.IsValid = () => {
41
+ this.controlUtility.IsValid(this.HtmlEditorFormControl);
42
+ };
43
+ HtmlEditorComponent.controlContainerstatic = this.controlContainer;
44
+ }
45
+ ngOnInit() {
46
+ this.editorConfig = {
47
+ editable: !this.options.IsDisabled,
48
+ spellcheck: true,
49
+ height: this.options.Height.toString(),
50
+ minHeight: this.options.Height.toString(),
51
+ maxHeight: 'auto',
52
+ width: 'auto',
53
+ minWidth: 'auto',
54
+ translate: 'yes',
55
+ enableToolbar: true,
56
+ showToolbar: true,
57
+ placeholder: this.options.Placeholder,
58
+ defaultParagraphSeparator: '',
59
+ defaultFontName: '',
60
+ defaultFontSize: '',
61
+ fonts: [
62
+ { class: 'arial', name: 'Arial' },
63
+ { class: 'times-new-roman', name: 'Times New Roman' },
64
+ { class: 'calibri', name: 'Calibri' },
65
+ { class: 'comic-sans-ms', name: 'Comic Sans MS' }
66
+ ],
67
+ customClasses: [
68
+ {
69
+ name: 'quote',
70
+ class: 'quote',
71
+ },
72
+ {
73
+ name: 'redText',
74
+ class: 'redText'
75
+ },
76
+ {
77
+ name: 'titleText',
78
+ class: 'titleText',
79
+ tag: 'h1',
80
+ },
81
+ ],
82
+ uploadUrl: 'v1/image',
83
+ uploadWithCredentials: false,
84
+ sanitize: true,
85
+ toolbarPosition: 'top',
86
+ toolbarHiddenButtons: []
87
+ };
88
+ this.controlValidationService.isCreatedBefor = false;
89
+ // this.miscList = this.options.ToolsList_Misc != null ? this.options.ToolsList_Misc : ['codeview', 'undo', 'redo'];
90
+ // this.styleList = this.options.ToolsList_Style != null ? this.options.ToolsList_Style : ['bold', 'italic', 'underline', 'clear']
91
+ // this.fontsizeList = this.options.ToolsList_FontSize != null ? this.options.ToolsList_FontSize : ['fontname', 'fontsize', 'color']
92
+ // this.paraList = this.options.ToolsList_Para != null ? this.options.ToolsList_Para : ['style', 'ul', 'ol', 'paragraph', 'height']
93
+ // this.insertList = this.options.ToolsList_Insert != null ? this.options.ToolsList_Insert : ['table', 'picture', 'link', 'video', 'hr']
94
+ // this.Config = {
95
+ // callbacks: {
96
+ // // onChange: (e) => {
97
+ // // this.zone.run(() => {
98
+ // // this.onTextChange();
99
+ // // });
100
+ // // },
101
+ // // onKeyup: (e) => {
102
+ // // this.zone.run(() => {
103
+ // // ;
104
+ // // this.onTextChange();
105
+ // // });
106
+ // // },
107
+ // // onKeydown: (e) => {
108
+ // // this.zone.run(() => {
109
+ // // ;
110
+ // // if (this.WordCountArray > this.options.MaxWordCount && e.keyCode != 8) {
111
+ // // e.preventDefault();
112
+ // // }
113
+ // // });
114
+ // // }
115
+ // },
116
+ // placeholder: this.options.Placeholder,
117
+ // height: `${this.options.Height}px`,
118
+ // toolbar: [
119
+ // ['misc', this.miscList],
120
+ // ['style', this.styleList],
121
+ // ['fontsize', this.fontsizeList],
122
+ // ['para', this.paraList],
123
+ // ['insert', this.insertList]
124
+ // ],
125
+ // fontNames: ['Helvetica', 'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Roboto', 'Times']
126
+ // }
127
+ this.group.addControl(this.options.Name, new FormControl(''));
128
+ this.HtmlEditorFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
129
+ this.HtmlEditorFormControl.setValue(this.options.Value);
130
+ if (this.options.CustomValidation.length > 0) {
131
+ let Validations = this.options.CustomValidation;
132
+ for (let index = 0; index < Validations.length; index++) {
133
+ const Validation = Validations[index];
134
+ this.validationRules.push(Validation.functionBody);
135
+ }
136
+ }
137
+ if (this.options.LabelKey != null && this.options.LabelKey != "")
138
+ this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
139
+ if (this.options.MinLength > 0) {
140
+ this.validationRules.push(Validators.minLength(this.options.MinLength));
141
+ }
142
+ if (this.options.MaxLength > 0) {
143
+ this.validationRules.push(Validators.maxLength(this.options.MaxLength));
144
+ }
145
+ if (this.options.IsRequired) {
146
+ this.validationRules.push(Validators.required);
147
+ }
148
+ this.HtmlEditorFormControl.setValidators(this.validationRules);
149
+ this.HtmlEditorFormControl.setAsyncValidators(this.validationRulesasync);
150
+ if (this.options.IsDisabled) {
151
+ this.HtmlEditorFormControl.disable();
152
+ }
153
+ this.HtmlEditorControlHost.ngSubmit.subscribe((value) => {
154
+ this.group.markAllAsTouched();
155
+ this.markAllAsTouched = true;
156
+ });
157
+ }
158
+ ngAfterViewInit() {
159
+ if (this.options.AttributeList != null) {
160
+ var element = document.getElementById(this.options.Name);
161
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
162
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
163
+ }
164
+ }
165
+ }
166
+ showGlobalError() {
167
+ this.controlUtility.showGlobalError();
168
+ }
169
+ getErrorValidation(ErrorList) {
170
+ if (this.markAllAsTouched && this.group.invalid) {
171
+ this.showGlobalError();
172
+ this.markAllAsTouched = false;
173
+ }
174
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
175
+ }
176
+ onValueChanged() {
177
+ this.OnChange.emit(this.HtmlEditorFormControl.value);
178
+ }
179
+ }
180
+ HtmlEditorComponent.controlContainerstatic = null;
181
+ HtmlEditorComponent.decorators = [
182
+ { type: Component, args: [{
183
+ selector: 'BBSF-HtmlEditor',
184
+ template: "<div class=\"b-control b-html-editor\">\r\n <div class=\"form-group row validate <!--is-invalid-->\" [formGroup]=\"group\">\r\n <label class=\"b-label col-form-label col-sm-12 col-md-12\" [hidden]=\"options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\"\r\n aria-required=\"true\">*</span>\r\n </label>\r\n\r\n <div class=\"col-sm-12 col-md-12\">\r\n <!-- <div [ngxSummernoteDisabled]=\"options.IsDisabled\" ngDefaultControl [ngxSummernote]=\"Config\"\r\n class=\"form-control bnsights-control {{options.ExtraClasses}}\"\r\n dir=\"{{options.ForceDirection==2?'rtl':''}}\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n formControlName=\"{{options.Name}}\" (change)=\"onValueChanged()\"\r\n [class.is-invalid]=\"HtmlEditorFormControl.invalid && HtmlEditorFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" \r\n ></div>\r\n -->\r\n <angular-editor (change)=\"onValueChanged()\" id=\"{{options.Name}}\" [class.is-invalid]=\"HtmlEditorFormControl.invalid && HtmlEditorFormControl.touched\" class=\"form-control bnsights-control {{options.ExtraClasses}}\" dir=\"{{options.ForceDirection==2?'rtl':''}}\" formControlName=\"{{options.Name}}\" [config]=\"editorConfig\"></angular-editor>\r\n\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(HtmlEditorFormControl.invalid && HtmlEditorFormControl.touched)\">\r\n {{getErrorValidation(HtmlEditorFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"control-desc text-dark\">{{options.LabelDescription}}</div>\r\n </div>\r\n\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 </div>\r\n</div>\r\n",
185
+ styles: [".example-form{min-width:150px;max-width:500px;width:100%}.example-full-width{width:100%}.flip_V{transform:scaleY(-1)}\n"]
186
+ },] }
187
+ ];
188
+ HtmlEditorComponent.ctorParameters = () => [
189
+ { type: NgZone },
190
+ { type: ControlUtility },
191
+ { type: ControlContainer, decorators: [{ type: Optional }] },
192
+ { type: FormGroupDirective },
193
+ { type: UtilityService },
194
+ { type: BBSFTranslateService },
195
+ { type: ControlValidationService }
196
+ ];
197
+ HtmlEditorComponent.propDecorators = {
198
+ group: [{ type: Input }],
199
+ options: [{ type: Input }],
200
+ OnChange: [{ type: Output }]
201
+ };
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHRtbEVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvSHRtbEVkaXRvci9IdG1sRWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQThCLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0gsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBR3RFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU8xRyxNQUFNLE9BQU8sbUJBQW1CO0lBSTlCLFlBQW9CLElBQVksRUFBVSxjQUE4QixFQUFzQixnQkFBa0MsRUFBUyxxQkFBeUMsRUFBUyxjQUE2QixFQUFTLFNBQStCLEVBQVMsd0JBQWlEO1FBQXRTLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBc0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFTLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBb0I7UUFBUyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQVMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUF5QjtRQUtoVCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd4QyxjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQU9sQyxvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUNyQix5QkFBb0IsR0FBRyxFQUFFLENBQUM7UUE4STFCLGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDcEQsQ0FBQyxDQUFBO1FBbUJELGlCQUFpQjtRQUVqQiw2QkFBd0IsR0FBRyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUcsQ0FBQyxDQUFBO1FBQ0QsaUJBQWlCO1FBRWpCLDBCQUFxQixHQUFHLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzRyxDQUFDLENBQUE7UUFHRCxpQkFBaUI7UUFDakIsMkJBQXNCLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUNoSCxDQUFDLENBQUE7UUFDRCxpQkFBaUI7UUFDakIsd0JBQW1CLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUM3RyxDQUFDLENBQUE7UUFFRCxpQkFBaUI7UUFDakIsWUFBTyxHQUFHLEdBQUcsRUFBRTtZQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQ3pELENBQUMsQ0FBQTtRQTVNQyxtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDckUsQ0FBQztJQWtCRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksR0FBRztZQUNoQixRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbEMsVUFBVSxFQUFFLElBQUk7WUFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN0QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ3pDLFNBQVMsRUFBRyxNQUFNO1lBQ2xCLEtBQUssRUFBRSxNQUFNO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsYUFBYSxFQUFFLElBQUk7WUFDbkIsV0FBVyxFQUFFLElBQUk7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNyQyx5QkFBeUIsRUFBRSxFQUFFO1lBQzdCLGVBQWUsRUFBRSxFQUFFO1lBQ25CLGVBQWUsRUFBRSxFQUFFO1lBQ25CLEtBQUssRUFBRTtnQkFDTCxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQztnQkFDL0IsRUFBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFDO2dCQUNuRCxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQztnQkFDbkMsRUFBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUM7YUFDaEQ7WUFDRCxhQUFhLEVBQUU7Z0JBQ2Y7b0JBQ0UsSUFBSSxFQUFFLE9BQU87b0JBQ2IsS0FBSyxFQUFFLE9BQU87aUJBQ2Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsS0FBSyxFQUFFLFNBQVM7aUJBQ2pCO2dCQUNEO29CQUNFLElBQUksRUFBRSxXQUFXO29CQUNqQixLQUFLLEVBQUUsV0FBVztvQkFDbEIsR0FBRyxFQUFFLElBQUk7aUJBQ1Y7YUFDRjtZQUNELFNBQVMsRUFBRSxVQUFVO1lBQ3JCLHFCQUFxQixFQUFFLEtBQUs7WUFDNUIsUUFBUSxFQUFFLElBQUk7WUFDZCxlQUFlLEVBQUUsS0FBSztZQUN0QixvQkFBb0IsRUFBRSxFQUVyQjtTQUNKLENBQUM7UUFDRixJQUFJLENBQUMsd0JBQXdCLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQTtRQUNsRCxvSEFBb0g7UUFDcEgsa0lBQWtJO1FBQ2xJLG9JQUFvSTtRQUNwSSxtSUFBbUk7UUFDbkksd0lBQXdJO1FBRXhJLGtCQUFrQjtRQUNsQixpQkFBaUI7UUFDakIsNEJBQTRCO1FBRTVCLG1DQUFtQztRQUNuQyxzQ0FBc0M7UUFDdEMsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWiwyQkFBMkI7UUFDM0IsbUNBQW1DO1FBQ25DLG9CQUFvQjtRQUNwQixzQ0FBc0M7UUFDdEMsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWiw2QkFBNkI7UUFDN0IsbUNBQW1DO1FBQ25DLG9CQUFvQjtRQUNwQiwwRkFBMEY7UUFDMUYseUNBQXlDO1FBQ3pDLG1CQUFtQjtRQUVuQixpQkFBaUI7UUFDakIsV0FBVztRQUNYLE9BQU87UUFDUCwyQ0FBMkM7UUFDM0Msd0NBQXdDO1FBQ3hDLGVBQWU7UUFDZiwrQkFBK0I7UUFDL0IsaUNBQWlDO1FBQ2pDLHVDQUF1QztRQUN2QywrQkFBK0I7UUFDL0Isa0NBQWtDO1FBQ2xDLE9BQU87UUFDUCx3R0FBd0c7UUFFeEcsSUFBSTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyx3Q0FBd0M7UUFDN0csSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzVDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUE7WUFDL0MsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3BEO1NBRUY7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQzlELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUl4RixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDdEM7UUFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFBO1FBQzlCLENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUdELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRTtZQUN0QyxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdEUsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEc7U0FFRjtJQUVILENBQUM7SUFNRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsU0FBUztRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUMvQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7WUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQTtTQUM5QjtRQUVELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUNELGNBQWM7UUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEQsQ0FBQzs7QUFuTE0sMENBQXNCLEdBQUcsSUFBSSxDQUFDOztZQVJ0QyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtnQkFDM0IsMnFFQUEwQzs7YUFFM0M7OztZQVhxRCxNQUFNO1lBRW5ELGNBQWM7WUFEdUMsZ0JBQWdCLHVCQWVELFFBQVE7WUFmTCxrQkFBa0I7WUFJekMsY0FBYztZQUE5RCxvQkFBb0I7WUFBRSx3QkFBd0I7OztvQkFjcEQsS0FBSztzQkFDTCxLQUFLO3VCQUNMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIERvQ2hlY2ssIE9wdGlvbmFsLCBOZ1pvbmUsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAsIEFic3RyYWN0Q29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgRm9ybUdyb3VwRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBDb250cm9sVXRpbGl0eSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9Db250cm9sVXRpbGl0eSc7XHJcbmltcG9ydCB7IEh0bWxFZGl0b3JPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9IdG1sRWRpdG9yT3B0aW9ucyc7XHJcbmltcG9ydCB7IEFuZ3VsYXJFZGl0b3JDb25maWcgfSBmcm9tICdAa29sa292L2FuZ3VsYXItZWRpdG9yJztcclxuaW1wb3J0IHsgQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLUh0bWxFZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9IdG1sRWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9IdG1sRWRpdG9yLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEh0bWxFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBlZGl0b3JDb25maWc6IEFuZ3VsYXJFZGl0b3JDb25maWcgXHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJzdGF0aWMgPSBudWxsO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIGNvbnRyb2xVdGlsaXR5OiBDb250cm9sVXRpbGl0eSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLCBwdWJsaWMgSHRtbEVkaXRvckNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUscHJpdmF0ZSBVdGlsaXR5U2VydmljZTpVdGlsaXR5U2VydmljZSxwcml2YXRlIHRyYW5zbGF0ZTogQkJTRlRyYW5zbGF0ZVNlcnZpY2UscHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6Q29udHJvbFZhbGlkYXRpb25TZXJ2aWNlKSB7XHJcbiAgICBIdG1sRWRpdG9yQ29tcG9uZW50LmNvbnRyb2xDb250YWluZXJzdGF0aWMgPSB0aGlzLmNvbnRyb2xDb250YWluZXI7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgb3B0aW9uczogSHRtbEVkaXRvck9wdGlvbnM7XHJcbiAgQE91dHB1dCgpIE9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBIdG1sRWRpdG9yRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBXb3JkQ291bnQ6IG51bWJlciA9IDA7XHJcbiAgV29yZENvdW50QXJyYXk6IG51bWJlciA9IDA7XHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIENvbmZpZzogYW55XHJcbiAgbWlzY0xpc3Q6IGFueVxyXG4gIHN0eWxlTGlzdDogYW55XHJcbiAgZm9udHNpemVMaXN0OiBhbnlcclxuICBwYXJhTGlzdDogYW55XHJcbiAgaW5zZXJ0TGlzdDogYW55XHJcbiAgdmFsaWRhdGlvblJ1bGVzID0gW107XHJcbiAgdmFsaWRhdGlvblJ1bGVzYXN5bmMgPSBbXTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmVkaXRvckNvbmZpZyA9IHtcclxuICAgICAgICBlZGl0YWJsZTogIXRoaXMub3B0aW9ucy5Jc0Rpc2FibGVkLFxyXG4gICAgICAgIHNwZWxsY2hlY2s6IHRydWUsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuSGVpZ2h0LnRvU3RyaW5nKCksXHJcbiAgICAgICAgbWluSGVpZ2h0OiB0aGlzLm9wdGlvbnMuSGVpZ2h0LnRvU3RyaW5nKCksXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAgJ2F1dG8nLFxyXG4gICAgICAgIHdpZHRoOiAnYXV0bycsXHJcbiAgICAgICAgbWluV2lkdGg6ICdhdXRvJyxcclxuICAgICAgICB0cmFuc2xhdGU6ICd5ZXMnLFxyXG4gICAgICAgIGVuYWJsZVRvb2xiYXI6IHRydWUsXHJcbiAgICAgICAgc2hvd1Rvb2xiYXI6IHRydWUsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMub3B0aW9ucy5QbGFjZWhvbGRlcixcclxuICAgICAgICBkZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yOiAnJyxcclxuICAgICAgICBkZWZhdWx0Rm9udE5hbWU6ICcnLFxyXG4gICAgICAgIGRlZmF1bHRGb250U2l6ZTogJycsXHJcbiAgICAgICAgZm9udHM6IFtcclxuICAgICAgICAgIHtjbGFzczogJ2FyaWFsJywgbmFtZTogJ0FyaWFsJ30sXHJcbiAgICAgICAgICB7Y2xhc3M6ICd0aW1lcy1uZXctcm9tYW4nLCBuYW1lOiAnVGltZXMgTmV3IFJvbWFuJ30sXHJcbiAgICAgICAgICB7Y2xhc3M6ICdjYWxpYnJpJywgbmFtZTogJ0NhbGlicmknfSxcclxuICAgICAgICAgIHtjbGFzczogJ2NvbWljLXNhbnMtbXMnLCBuYW1lOiAnQ29taWMgU2FucyBNUyd9XHJcbiAgICAgICAgXSxcclxuICAgICAgICBjdXN0b21DbGFzc2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ3F1b3RlJyxcclxuICAgICAgICAgIGNsYXNzOiAncXVvdGUnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ3JlZFRleHQnLFxyXG4gICAgICAgICAgY2xhc3M6ICdyZWRUZXh0J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ3RpdGxlVGV4dCcsXHJcbiAgICAgICAgICBjbGFzczogJ3RpdGxlVGV4dCcsXHJcbiAgICAgICAgICB0YWc6ICdoMScsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgICAgdXBsb2FkVXJsOiAndjEvaW1hZ2UnLFxyXG4gICAgICB1cGxvYWRXaXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxyXG4gICAgICBzYW5pdGl6ZTogdHJ1ZSxcclxuICAgICAgdG9vbGJhclBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgdG9vbGJhckhpZGRlbkJ1dHRvbnM6IFtcclxuICAgICAgXHJcbiAgICAgIF1cclxuICB9O1xyXG4gIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2VcclxuICAgIC8vIHRoaXMubWlzY0xpc3QgPSB0aGlzLm9wdGlvbnMuVG9vbHNMaXN0X01pc2MgIT0gbnVsbCA/IHRoaXMub3B0aW9ucy5Ub29sc0xpc3RfTWlzYyA6IFsnY29kZXZpZXcnLCAndW5kbycsICdyZWRvJ107XHJcbiAgICAvLyB0aGlzLnN0eWxlTGlzdCA9IHRoaXMub3B0aW9ucy5Ub29sc0xpc3RfU3R5bGUgIT0gbnVsbCA/IHRoaXMub3B0aW9ucy5Ub29sc0xpc3RfU3R5bGUgOiBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdjbGVhciddXHJcbiAgICAvLyB0aGlzLmZvbnRzaXplTGlzdCA9IHRoaXMub3B0aW9ucy5Ub29sc0xpc3RfRm9udFNpemUgIT0gbnVsbCA/IHRoaXMub3B0aW9ucy5Ub29sc0xpc3RfRm9udFNpemUgOiBbJ2ZvbnRuYW1lJywgJ2ZvbnRzaXplJywgJ2NvbG9yJ11cclxuICAgIC8vIHRoaXMucGFyYUxpc3QgPSB0aGlzLm9wdGlvbnMuVG9vbHNMaXN0X1BhcmEgIT0gbnVsbCA/IHRoaXMub3B0aW9ucy5Ub29sc0xpc3RfUGFyYSA6IFsnc3R5bGUnLCAndWwnLCAnb2wnLCAncGFyYWdyYXBoJywgJ2hlaWdodCddXHJcbiAgICAvLyB0aGlzLmluc2VydExpc3QgPSB0aGlzLm9wdGlvbnMuVG9vbHNMaXN0X0luc2VydCAhPSBudWxsID8gdGhpcy5vcHRpb25zLlRvb2xzTGlzdF9JbnNlcnQgOiBbJ3RhYmxlJywgJ3BpY3R1cmUnLCAnbGluaycsICd2aWRlbycsICdociddXHJcblxyXG4gICAgLy8gdGhpcy5Db25maWcgPSB7XHJcbiAgICAvLyAgIGNhbGxiYWNrczoge1xyXG4gICAgLy8gICAgIC8vIG9uQ2hhbmdlOiAoZSkgPT4ge1xyXG5cclxuICAgIC8vICAgICAvLyAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAvLyAgICAgLy8gICAgICAgICB0aGlzLm9uVGV4dENoYW5nZSgpO1xyXG4gICAgLy8gICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICAvLyB9LFxyXG4gICAgLy8gICAgIC8vIG9uS2V5dXA6IChlKSA9PiB7XHJcbiAgICAvLyAgICAgLy8gICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgLy8gICAgIC8vICAgICAgICAgIDtcclxuICAgIC8vICAgICAvLyAgICAgICAgIHRoaXMub25UZXh0Q2hhbmdlKCk7XHJcbiAgICAvLyAgICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIC8vIH0sXHJcbiAgICAvLyAgICAgLy8gb25LZXlkb3duOiAoZSkgPT4ge1xyXG4gICAgLy8gICAgIC8vICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgIC8vICAgICAvLyAgICAgICAgICA7XHJcbiAgICAvLyAgICAgLy8gICAgICAgICBpZiAodGhpcy5Xb3JkQ291bnRBcnJheSA+IHRoaXMub3B0aW9ucy5NYXhXb3JkQ291bnQgJiYgZS5rZXlDb2RlICE9IDgpIHtcclxuICAgIC8vICAgICAvLyAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAvLyAgICAgLy8gICAgICAgICB9XHJcblxyXG4gICAgLy8gICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICAvLyB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIHBsYWNlaG9sZGVyOiB0aGlzLm9wdGlvbnMuUGxhY2Vob2xkZXIsXHJcbiAgICAvLyAgIGhlaWdodDogYCR7dGhpcy5vcHRpb25zLkhlaWdodH1weGAsXHJcbiAgICAvLyAgIHRvb2xiYXI6IFtcclxuICAgIC8vICAgICBbJ21pc2MnLCB0aGlzLm1pc2NMaXN0XSxcclxuICAgIC8vICAgICBbJ3N0eWxlJywgdGhpcy5zdHlsZUxpc3RdLFxyXG4gICAgLy8gICAgIFsnZm9udHNpemUnLCB0aGlzLmZvbnRzaXplTGlzdF0sXHJcbiAgICAvLyAgICAgWydwYXJhJywgdGhpcy5wYXJhTGlzdF0sXHJcbiAgICAvLyAgICAgWydpbnNlcnQnLCB0aGlzLmluc2VydExpc3RdXHJcbiAgICAvLyAgIF0sXHJcbiAgICAvLyAgIGZvbnROYW1lczogWydIZWx2ZXRpY2EnLCAnQXJpYWwnLCAnQXJpYWwgQmxhY2snLCAnQ29taWMgU2FucyBNUycsICdDb3VyaWVyIE5ldycsICdSb2JvdG8nLCAnVGltZXMnXVxyXG5cclxuICAgIC8vIH1cclxuICAgIHRoaXMuZ3JvdXAuYWRkQ29udHJvbCh0aGlzLm9wdGlvbnMuTmFtZSwgbmV3IEZvcm1Db250cm9sKCcnKSk7XHJcbiAgICB0aGlzLkh0bWxFZGl0b3JGb3JtQ29udHJvbCA9IHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkh0bWxFZGl0b3JGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMuVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTGFiZWxLZXkgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuTGFiZWxLZXkgIT0gXCJcIilcclxuICAgICAgdGhpcy5vcHRpb25zLkxhYmVsVmFsdWUgPSB0aGlzLlV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUodGhpcy5vcHRpb25zLkxhYmVsS2V5KTtcclxuXHJcblxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTWluTGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMub3B0aW9ucy5NaW5MZW5ndGgpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuTWF4TGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMub3B0aW9ucy5NYXhMZW5ndGgpKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5IdG1sRWRpdG9yRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLkh0bWxFZGl0b3JGb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXNhc3luYyk7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLklzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5IdG1sRWRpdG9yRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuSHRtbEVkaXRvckNvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cC5tYXJrQWxsQXNUb3VjaGVkKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZVxyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0uS2V5LCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5SZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JWYWxpZGF0aW9uKEVycm9yTGlzdCkge1xyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoRXJyb3JMaXN0LCB0aGlzLmdyb3VwLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuICBvblZhbHVlQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLkh0bWxFZGl0b3JGb3JtQ29udHJvbC52YWx1ZSlcclxuICB9XHJcblxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG5cclxuICBSZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLkh0bWxFZGl0b3JGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucylcclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuXHJcbiAgQWRkUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5IdG1sRWRpdG9yRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG5cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbih0aGlzLkh0bWxFZGl0b3JGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZEN1c3RvbVZhbGlkYXRpb24odGhpcy5IdG1sRWRpdG9yRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gIH1cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBJc1ZhbGlkID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Jc1ZhbGlkKHRoaXMuSHRtbEVkaXRvckZvcm1Db250cm9sKVxyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=
@@ -0,0 +1,304 @@
1
+ import { Component, Input, Optional, ViewChild, NgZone, Output, EventEmitter } from '@angular/core';
2
+ import { FormControl, Validators, ControlContainer, FormGroupDirective } from '@angular/forms';
3
+ import { ErrorMassageValidation } from '../../Shared/services/validationErrorMassage.service';
4
+ import { ControlUtility } from '../../Shared/services/ControlUtility';
5
+ import { FileUploader, FileLikeObject } from 'ng2-file-upload';
6
+ import { BBSFTranslateService, ControlValidationService, UtilityService } from '@bnsights/bbsf-utilities';
7
+ export class ImageUploaderComponent {
8
+ constructor(zone, ErrorHandler, controlUtility, controlContainer, ImageUplaoderControlHost, UtilityService, translate, controlValidationService) {
9
+ this.zone = zone;
10
+ this.ErrorHandler = ErrorHandler;
11
+ this.controlUtility = controlUtility;
12
+ this.controlContainer = controlContainer;
13
+ this.ImageUplaoderControlHost = ImageUplaoderControlHost;
14
+ this.UtilityService = UtilityService;
15
+ this.translate = translate;
16
+ this.controlValidationService = controlValidationService;
17
+ this.files = [];
18
+ this.ImageSource = "./src/assets/images/uploadimg.png";
19
+ this.OnChange = new EventEmitter();
20
+ this.ValidationMessage = "";
21
+ this.AcceptedType = "";
22
+ this.AcceptedTypeArray = [];
23
+ this.ToolTipTypeArray = [];
24
+ this.imgUrl = null;
25
+ this.config = null;
26
+ this.imageUrl = "";
27
+ this.imgwUrl = "";
28
+ this.mdlSampleIsOpen = false;
29
+ this.markAllAsTouched = false;
30
+ this.validationRules = [];
31
+ this.validationRulesasync = [];
32
+ this.resetError = () => {
33
+ this.controlValidationService.RemoveGlobalError();
34
+ };
35
+ //External Method
36
+ this.RemoveRequiredValidation = () => {
37
+ this.controlUtility.RemoveRequiredValidation(this.ImageUploadFormControl, this.validationRules, this.options);
38
+ };
39
+ //External Method
40
+ this.AddRequiredValidation = () => {
41
+ this.controlUtility.AddRequiredValidation(this.ImageUploadFormControl, this.validationRules, this.options);
42
+ };
43
+ //External Method
44
+ this.RemoveCustomValidation = (CustomValidation) => {
45
+ this.controlUtility.RemoveCustomValidation(this.ImageUploadFormControl, this.validationRules, CustomValidation);
46
+ };
47
+ //External Method
48
+ this.AddCustomValidation = (CustomValidation) => {
49
+ this.controlUtility.AddCustomValidation(this.ImageUploadFormControl, this.validationRules, CustomValidation);
50
+ };
51
+ //External Method
52
+ this.IsValid = () => {
53
+ this.controlUtility.IsValid(this.ImageUploadFormControl);
54
+ };
55
+ ImageUploaderComponent.controlContainerstatic = this.controlContainer;
56
+ this.uploader = new FileUploader({
57
+ disableMultipart: false, // 'DisableMultipart' must be 'true' for formatDataFunction to be called.
58
+ });
59
+ this.hasAnotherDropZoneOver = false;
60
+ }
61
+ ngOnInit() {
62
+ this.controlValidationService.isCreatedBefor = false;
63
+ if (this.options.DefaultImageSrc != null && this.options.DefaultImageSrc != "")
64
+ this.ImageSource = this.options.DefaultImageSrc;
65
+ if (this.options.AllowImageCropper) {
66
+ this.config = {
67
+ aspectRatio: this.options.ImageCropperWidth / this.options.ImageCropperHeight,
68
+ dragMode: 'move',
69
+ background: true,
70
+ movable: true,
71
+ rotatable: true,
72
+ scalable: true,
73
+ zoomable: true,
74
+ viewMode: 1,
75
+ checkImageOrigin: true,
76
+ modal: true,
77
+ checkCrossOrigin: false,
78
+ width: this.options.ImageCropperWidth,
79
+ height: this.options.ImageCropperHeight,
80
+ cropBoxResizable: false,
81
+ autoCrop: true
82
+ };
83
+ }
84
+ if (this.options.FileUploadAcceptsTypes != null) {
85
+ this.options.FileUploadAcceptsTypes;
86
+ }
87
+ if (this.options.Value != null) {
88
+ let imgURL = this.options.Value["fileURL"];
89
+ if (imgURL != "" && imgURL != undefined && imgURL != null)
90
+ this.ImageSource = imgURL;
91
+ let element = this.options.Value;
92
+ this.FileLikeObject = new FileLikeObject({
93
+ name: element.FileName,
94
+ size: element.FileSizeInMB * 1000 * 1000,
95
+ type: element.FileType
96
+ });
97
+ this.uploader.addToQueue([this.FileLikeObject]);
98
+ }
99
+ if (this.options.FileUploadAcceptsTypes != null && this.options.FileUploadAcceptsTypes.length > 0) {
100
+ for (let index = 0; index < this.options.FileUploadAcceptsTypes.length; index++) {
101
+ const Type = this.options.FileUploadAcceptsTypes[index];
102
+ this.AcceptedType = this.AcceptedType + Type;
103
+ }
104
+ this.AcceptedTypeArray = this.AcceptedType.split(",");
105
+ for (let index = 0; index < this.AcceptedTypeArray.length; index++) {
106
+ const element = this.AcceptedTypeArray[index];
107
+ const TypeToolTipe = element.split('/')[1];
108
+ this.ToolTipTypeArray.push(TypeToolTipe);
109
+ }
110
+ this.ValidationMessage = this.ValidationMessage + ` Allowed extenstions (${this.ToolTipTypeArray}) `;
111
+ }
112
+ if (this.options.FileMaxSizeInMB > 0) {
113
+ this.ValidationMessage = this.ValidationMessage + ` <br />Max File Size ${this.options.FileMaxSizeInMB} MB`;
114
+ }
115
+ if (this.options.FileUploadAcceptsTypes != null && this.options.FileUploadAcceptsTypes.length > 0) {
116
+ }
117
+ this.group.addControl(this.options.Name, new FormControl(''));
118
+ this.ImageUploadFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
119
+ if (this.options.LabelKey != null && this.options.LabelKey != "")
120
+ this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
121
+ if (this.options.CustomValidation.length > 0) {
122
+ let Validations = this.options.CustomValidation;
123
+ for (let index = 0; index < Validations.length; index++) {
124
+ const Validation = Validations[index];
125
+ this.validationRules.push(Validation.functionBody);
126
+ }
127
+ }
128
+ if (this.options.IsRequired) {
129
+ this.validationRules.push(Validators.required);
130
+ }
131
+ this.ImageUploadFormControl.setValidators(this.validationRules);
132
+ this.ImageUploadFormControl.setAsyncValidators(this.validationRulesasync);
133
+ if (this.options.IsDisabled) {
134
+ this.ImageUploadFormControl.disable();
135
+ }
136
+ this.ImageUplaoderControlHost.ngSubmit.subscribe((value) => {
137
+ this.group.markAllAsTouched();
138
+ this.markAllAsTouched = true;
139
+ });
140
+ }
141
+ ngAfterViewInit() {
142
+ if (this.options.AttributeList != null) {
143
+ var element = document.getElementById(this.options.Name);
144
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
145
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
146
+ }
147
+ }
148
+ }
149
+ showGlobalError() {
150
+ this.controlUtility.showGlobalError();
151
+ }
152
+ getErrorValidation(ErrorList) {
153
+ if (this.markAllAsTouched && this.group.invalid) {
154
+ this.showGlobalError();
155
+ this.markAllAsTouched = false;
156
+ }
157
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
158
+ }
159
+ onFileChange(event) {
160
+ if (event.rejectedFiles.length > 0) {
161
+ const file = event.rejectedFiles[0];
162
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
163
+ const fileType = file.type;
164
+ if (file.size > maxFileSize) {
165
+ const formControl = this.ImageUploadFormControl;
166
+ formControl.setErrors({ FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M' });
167
+ formControl.markAsTouched();
168
+ this.uploader.queue = [];
169
+ return;
170
+ }
171
+ if (this.options.FileUploadAcceptsTypes != null && this.options.FileUploadAcceptsTypes.length > 0 && !(this.AcceptedTypeArray.includes(fileType.toUpperCase()) || this.AcceptedTypeArray.includes(fileType.toLowerCase()))) {
172
+ const formControl = this.ImageUploadFormControl;
173
+ formControl.setErrors({ ToolTipTypeError: this.ToolTipTypeArray });
174
+ formControl.markAsTouched();
175
+ this.uploader.queue = [];
176
+ return;
177
+ }
178
+ }
179
+ let FilesArray = [];
180
+ for (let index = 0; index < event.addedFiles.length; index++) {
181
+ const file = event.addedFiles[0];
182
+ this.EventFile = file;
183
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
184
+ if (file) {
185
+ const maxFileSize = this.options.FileMaxSizeInMB * 1000 * 1000;
186
+ const fileType = file.type;
187
+ if (file.size > maxFileSize) {
188
+ const formControl = this.ImageUploadFormControl;
189
+ formControl.setErrors({ FileMaxSizeInMB: this.options.FileMaxSizeInMB + 'M' });
190
+ formControl.markAsTouched();
191
+ this.uploader.queue = [];
192
+ return;
193
+ }
194
+ let reader = new FileReader();
195
+ let FileObject = file;
196
+ reader.readAsDataURL(FileObject);
197
+ reader.onload = () => {
198
+ if (this.options.AllowImageCropper) {
199
+ this.imageUrl = reader.result.toString();
200
+ this.openModal(true);
201
+ }
202
+ else {
203
+ let FileObject = {
204
+ FileName: file.name,
205
+ FileType: file.type,
206
+ FileBase64: reader.result.toString().split(',')[1],
207
+ FileSizeInMB: ((file.size / 1000) / 1000),
208
+ NameWithExtension: file.name
209
+ };
210
+ FilesArray.push(FileObject);
211
+ this.group.get(this.options.Name).setValue(FileObject);
212
+ this.files = [];
213
+ this.files.push(...event.addedFiles);
214
+ }
215
+ this.OnChange.emit(this.ImageUploadFormControl.value);
216
+ };
217
+ }
218
+ }
219
+ }
220
+ removeFromControlValue(event) {
221
+ let ItemList = this.group.get(this.options.Name).value;
222
+ this.files = [];
223
+ ItemList = null;
224
+ if ((this.files.length == 0) && this.options.IsRequired) {
225
+ this.ImageUploadFormControl.markAsTouched();
226
+ this.ImageUploadFormControl.setErrors(Validators.required);
227
+ this.ImageUploadFormControl.invalid;
228
+ }
229
+ this.group.get(this.options.Name).setValue(ItemList);
230
+ this.OnChange.emit(this.group.get(this.options.Name).value);
231
+ }
232
+ cropImage() {
233
+ let ImageCropperObject = this.angularCropper.cropper.getCroppedCanvas({
234
+ width: this.options.ImageCropperWidth,
235
+ height: this.options.ImageCropperHeight,
236
+ imageSmoothingEnabled: false,
237
+ imageSmoothingQuality: 'high',
238
+ });
239
+ ImageCropperObject.toBlob((blob) => {
240
+ this.zone.run(() => {
241
+ this.getBlobFile(blob);
242
+ });
243
+ });
244
+ }
245
+ getBlobFile(blob) {
246
+ let FilesArray = [];
247
+ let BlobFile;
248
+ let reader = new FileReader();
249
+ BlobFile = blob;
250
+ reader.readAsDataURL(BlobFile);
251
+ reader.onload = () => {
252
+ let FileObject = {
253
+ FileName: this.EventFile.name,
254
+ FileType: this.EventFile.type,
255
+ FileBase64: reader.result.toString().split(',')[1],
256
+ FileSizeInMB: ((BlobFile.size / 1000) / 1000),
257
+ };
258
+ BlobFile.name = this.EventFile.name;
259
+ FilesArray.push(FileObject);
260
+ this.group.get(this.options.Name).setValue(FileObject);
261
+ this.files = [];
262
+ this.files.push(BlobFile);
263
+ this.openModal(false);
264
+ };
265
+ }
266
+ rotateImage(degree) {
267
+ this.angularCropper.cropper.rotate(degree);
268
+ }
269
+ moveImage(offsetX, offsetY) {
270
+ this.angularCropper.cropper.move(offsetX, offsetY);
271
+ }
272
+ zoomImage(ratio) {
273
+ this.angularCropper.cropper.zoom(ratio);
274
+ }
275
+ openModal(open) {
276
+ this.mdlSampleIsOpen = open;
277
+ }
278
+ }
279
+ ImageUploaderComponent.controlContainerstatic = null;
280
+ ImageUploaderComponent.decorators = [
281
+ { type: Component, args: [{
282
+ selector: 'BBSF-ImageUpload',
283
+ template: "<div class=\"b-control b-image-upload\">\r\n <div class=\"form-group row validate is-invalid\" [formGroup]=\"group\">\r\n <label class=\"b-label col-form-label col-sm-12 \" [ngClass]=\"(options.ViewType==1)?'col-md-12':'col-md-3'\" [hidden]=\"options.HideLabel\">\r\n {{options.LabelValue}}\r\n <span *ngIf=\"(options.ShowAsterisk&&options.IsRequired)||(options.IsRequired)\" class=\"text-danger Required-text\" aria-required=\"true\">*</span>\r\n\r\n <ejs-tooltip id=\"tooltip\" content='{{ValidationMessage}}' tipPointerPosition='Middle'>\r\n <i class=\"fa fa-info-circle\" data-plugin=\"tooltip\" data-html=\"true\">\r\n </i>\r\n </ejs-tooltip>\r\n </label>\r\n\r\n <div class=\"col-sm-12\" [ngClass]=\"(options.ViewType==1)?'':'col-md-9'\">\r\n\r\n <div *ngIf=\"options.AllowDropZone\" style=\"max-width:200px !important; max-height: 200px !important;\" class=\"d-inline-flex h-auto w-auto overflow-hidden m-0 {{options.ExtraClasses}}\" ngx-dropzone [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\" [multiple]=\"options.IsMultiple\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.Name}}\" [maxFileSize]=\"options.FileMaxSizeInMB\"\r\n id=\"{{options.Name}}\" [class.is-invalid]=\"ImageUploadFormControl.invalid && ImageUploadFormControl.touched\">\r\n <ngx-dropzone-label class=\"h-100 m-0\" style=\"max-width: 200px !important;\">\r\n <div class=\"h-100\">\r\n <img [src]=\"ImageSource\" class=\"h-100 w-100\" />\r\n </div>\r\n </ngx-dropzone-label>\r\n\r\n\r\n <ngx-dropzone-image-preview style=\"max-width:200px !important; max-height: 200px !important;\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\" class=\"b-img-preview w-100 h-100 m-0\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n\r\n <div class=\"ImageUploadClassSelector\" *ngIf=\"!options.AllowDropZone\" >\r\n <ngx-dropzone-label class=\"h-100 m-0\" *ngIf=\"files.length==0\" >\r\n <div style=\"max-width:200px !important; max-height: 200px !important;\" class=\"h-100 file-fake-input\" onclick=\"$(this).parents('.ImageUploadClassSelector').find('input[type=file]').click();\">\r\n <img [src]=\"ImageSource\" class=\"h-100 w-100\" />\r\n </div>`\r\n </ngx-dropzone-label>\r\n\r\n <div style=\"border: none !important; max-width:200px !important; max-height: 200px !important;\" class=\" fileSelector customImageUploadPlacment d-inline-flex h-auto w-auto overflow-hidden m-0 {{options.ExtraClasses}}\" ngx-dropzone [disabled]=\"options.IsDisabled\" [accept]=\"AcceptedType\" [multiple]=\"options.IsMultiple\"\r\n (change)=\"onFileChange($event)\" aria-describedby=\"email-error\" aria-invalid=\"true\" ngDefaultControl formControlName=\"{{options.Name}}\" [maxFileSize]=\"options.FileMaxSizeInMB\"\r\n id=\"{{options.Name}}\" [class.is-invalid]=\"ImageUploadFormControl.invalid && ImageUploadFormControl.touched\">\r\n \r\n\r\n\r\n <ngx-dropzone-image-preview style=\"max-width:200px !important; max-height: 200px !important;\" *ngFor=\"let f of files\" [file]=\"f\" [removable]=\"true\" (removed)=\"removeFromControlValue(f)\"\r\n ngProjectAs=\"ngx-dropzone-preview\" class=\"b-img-preview w-100 h-100 m-0\">\r\n </ngx-dropzone-image-preview>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"mdlSample\" class=\"modal fade\" role=\"dialog\" style=\"z-index: 11 !important ;\"\r\n [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 Crop Image\r\n </h4>\r\n </div>\r\n <div class=\"modal-body py-5\">\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 style=\"text-align:center;\">\r\n <div class=\"btn-group\">\r\n <button type=\"button\" (click)=\"zoomImage(0.1)\" class=\"btn btn-default\" data-method=\"zoom\" data-option=\"0.1\" title=\"Zoom In\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.zoom(0.1)\">\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\" data-method=\"zoom\" data-option=\"-0.1\" title=\"Zoom Out\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.zoom(-0.1)\">\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\" data-method=\"move\" data-option=\"-10\" data-second-option=\"0\" title=\"Move Left\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.move(-10, 0)\" aria-describedby=\"tooltip631939\">\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\" data-method=\"move\" data-option=\"10\" data-second-option=\"0\" title=\"Move Right\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.move(10, 0)\">\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\" data-method=\"move\" data-option=\"0\" data-second-option=\"-10\" title=\"Move Up\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.move(0, -10)\">\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\" data-method=\"move\" data-option=\"0\" data-second-option=\"10\" title=\"Move Down\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.move(0, 10)\">\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\" data-method=\"rotate\" data-option=\"-45\" title=\"Rotate Left\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.rotate(-45)\" aria-describedby=\"tooltip236044\">\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\" data-method=\"rotate\" data-option=\"45\" title=\"Rotate Right\">\r\n <span class=\"docs-tooltip\" data-toggle=\"tooltip\" title=\"\" data-original-title=\"cropper.rotate(45)\">\r\n <span class=\"fa fa-redo-alt\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\" align=\"right\">\r\n <button type=\"button\" id=\"btnClose\" class=\"btn btn-default\" (click)=\"openModal(false)\">\r\n <i class=\"fa fa-times fa-fw\"></i> Cancel\r\n </button>\r\n <button type=\"button\" (click)=\"cropImage()\" id=\"btnOK\" class=\"btn btn-success\">\r\n <i class=\"fa fa-check fa-fw\"></i>\r\n Crop\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"text-danger Required-text\"\r\n *ngIf=\"(ImageUploadFormControl.invalid && ImageUploadFormControl.touched)\">\r\n {{getErrorValidation(ImageUploadFormControl.errors|keyvalue)}}\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <div class=\"control-desc text-dark\">{{options.LabelDescription}}</div>\r\n </div>\r\n\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 </div>\r\n</div>\r\n",
284
+ styles: [".e-tip-content{background-color:#afafaf;color:#fff;padding-left:10px;padding-right:10px;padding-top:2px}.my-drop-zone{border:dotted 3px lightgray}.nv-file-over{border:dotted 3px red}.another-file-over-class{border:dotted 3px green}html,body{height:100%}.modal{display:none;position:fixed;z-index:1;padding-top:100px;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:#0006}.modal-content{position:relative;background-color:#fefefe;margin:auto;padding:0;border:1px solid #888;width:80%;box-shadow:0 4px 8px #0003,0 6px 20px #00000030;-webkit-animation-name:animatetop;-webkit-animation-duration:.4s;animation-name:animatetop;animation-duration:.4s}@keyframes animatetop{0%{top:-300px;opacity:0}to{top:0;opacity:1}}.close{color:#fff;float:right;font-size:28px;font-weight:bold}.ImageUploadClassSelector img{cursor:pointer}.d-inline-flex.h-auto.m-0.overflow-hidden.w-auto.ng-untouched.ng-pristine.ng-valid{border-radius:40px;border-color:#c7c7c7}\n"]
285
+ },] }
286
+ ];
287
+ ImageUploaderComponent.ctorParameters = () => [
288
+ { type: NgZone },
289
+ { type: ErrorMassageValidation },
290
+ { type: ControlUtility },
291
+ { type: ControlContainer, decorators: [{ type: Optional }] },
292
+ { type: FormGroupDirective },
293
+ { type: UtilityService },
294
+ { type: BBSFTranslateService },
295
+ { type: ControlValidationService }
296
+ ];
297
+ ImageUploaderComponent.propDecorators = {
298
+ fileInput: [{ type: ViewChild, args: ['fileInput', { static: false },] }],
299
+ group: [{ type: Input }],
300
+ options: [{ type: Input }],
301
+ OnChange: [{ type: Output }],
302
+ angularCropper: [{ type: ViewChild, args: ['angularCropper', { static: false },] }]
303
+ };
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZ2VVcGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL0ltYWdlVXBsb2FkL0ltYWdlVXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFjLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUE4QixnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFxQixjQUFjLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUk1RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFRMUcsTUFBTSxPQUFPLHNCQUFzQjtJQWdDakMsWUFBb0IsSUFBWSxFQUFVLFlBQW9DLEVBQVUsY0FBOEIsRUFBc0IsZ0JBQWtDLEVBQVMsd0JBQTRDLEVBQVMsY0FBNkIsRUFBUyxTQUErQixFQUFTLHdCQUFpRDtRQUF2VixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQXdCO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQXNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBUyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQW9CO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFBUyxjQUFTLEdBQVQsU0FBUyxDQUFzQjtR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O1lBQ3RCLGNBQWM7WUFGdUMsZ0JBQWdCLHVCQStDNkMsUUFBUTtZQS9DbkQsa0JBQWtCO1lBT3pDLGNBQWM7WUFBOUQsb0JBQW9CO1lBQUUsd0JBQXdCOzs7d0JBWXBELFNBQVMsU0FBQyxXQUFXLEVBQUMsRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDO29CQUlwQyxLQUFLO3NCQUNMLEtBQUs7dUJBQ0wsTUFBTTs2QkFXTixTQUFTLFNBQUMsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPcHRpb25hbCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBOZ1pvbmUsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBGb3JtR3JvdXAsIEFic3RyYWN0Q29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgRm9ybUdyb3VwRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBFcnJvck1hc3NhZ2VWYWxpZGF0aW9uIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL3ZhbGlkYXRpb25FcnJvck1hc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgRmlsZVVwbG9hZGVyLCBGaWxlRHJvcERpcmVjdGl2ZSwgRmlsZUxpa2VPYmplY3QsIEZpbGVJdGVtIH0gZnJvbSAnbmcyLWZpbGUtdXBsb2FkJztcclxuaW1wb3J0IHsgRmlsZURUTyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvRmlsZURUTyc7XHJcbmltcG9ydCB7IEltYWdlVXBsb2FkT3B0aW9ucyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvSW1hZ2VVcGxvYWRPcHRpb25zJztcclxuaW1wb3J0IHsgQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJ2FuZ3VsYXItY3JvcHBlcmpzJztcclxuaW1wb3J0IHsgQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1JbWFnZVVwbG9hZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL0ltYWdlVXBsb2FkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9JbWFnZVVwbG9hZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbWFnZVVwbG9hZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJzdGF0aWMgPSBudWxsO1xyXG5cclxuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLHtzdGF0aWM6ZmFsc2V9KSBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcbiAgZmlsZXM6IEZpbGVbXSA9IFtdO1xyXG4gIEltYWdlU291cmNlOiBzdHJpbmcgPSBcIi4vc3JjL2Fzc2V0cy9pbWFnZXMvdXBsb2FkaW1nLnBuZ1wiXHJcbiAgaXNTdWJtaXR0ZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBJbWFnZVVwbG9hZE9wdGlvbnM7XHJcbiAgQE91dHB1dCgpIE9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBJbWFnZVVwbG9hZEZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2w7XHJcbiAgVmFsaWRhdGlvbk1lc3NhZ2UgPSBcIlwiXHJcbiAgdXBsb2FkZXI6IEZpbGVVcGxvYWRlcjtcclxuICBoYXNBbm90aGVyRHJvcFpvbmVPdmVyOiBib29sZWFuO1xyXG4gIEFjY2VwdGVkVHlwZTogc3RyaW5nID0gXCJcIjtcclxuICBBY2NlcHRlZFR5cGVBcnJheTogc3RyaW5nW10gPSBbXTtcclxuICBUb29sVGlwVHlwZUFycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIEZpbGVMaWtlT2JqZWN0OiBGaWxlTGlrZU9iamVjdDtcclxuICBjb250cm9sOiBGb3JtQ29udHJvbDtcclxuICBAVmlld0NoaWxkKCdhbmd1bGFyQ3JvcHBlcicsIHtzdGF0aWM6ZmFsc2V9KSBwdWJsaWMgYW5ndWxhckNyb3BwZXI6IENyb3BwZXJDb21wb25lbnQ7XHJcbiAgaW1nVXJsID0gbnVsbDtcclxuICBjb25maWcgPSBudWxsO1xyXG4gIGltYWdlVXJsID0gXCJcIlxyXG4gIGltZ3dVcmwgPSBcIlwiXHJcbiAgRXZlbnRGaWxlOiBhbnk7XHJcbiAgbWRsU2FtcGxlSXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIEVycm9ySGFuZGxlcjogRXJyb3JNYXNzYWdlVmFsaWRhdGlvbiwgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lciwgcHVibGljIEltYWdlVXBsYW9kZXJDb250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLHByaXZhdGUgVXRpbGl0eVNlcnZpY2U6VXRpbGl0eVNlcnZpY2UscHJpdmF0ZSB0cmFuc2xhdGU6IEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLHByaXZhdGUgY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlOkNvbnRyb2xWYWxpZGF0aW9uU2VydmljZSkge1xyXG4gICAgSW1hZ2VVcGxvYWRlckNvbXBvbmVudC5jb250cm9sQ29udGFpbmVyc3RhdGljID0gdGhpcy5jb250cm9sQ29udGFpbmVyO1xyXG4gICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoe1xyXG4gICAgICBkaXNhYmxlTXVsdGlwYXJ0OiBmYWxzZSwgLy8gJ0Rpc2FibGVNdWx0aXBhcnQnIG11c3QgYmUgJ3RydWUnIGZvciBmb3JtYXREYXRhRnVuY3Rpb24gdG8gYmUgY2FsbGVkLlxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmhhc0Fub3RoZXJEcm9wWm9uZU92ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2VcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkRlZmF1bHRJbWFnZVNyYyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5EZWZhdWx0SW1hZ2VTcmMgIT0gXCJcIilcclxuICAgICAgdGhpcy5JbWFnZVNvdXJjZSA9IHRoaXMub3B0aW9ucy5EZWZhdWx0SW1hZ2VTcmNcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkFsbG93SW1hZ2VDcm9wcGVyKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0ge1xyXG4gICAgICAgIGFzcGVjdFJhdGlvOiB0aGlzLm9wdGlvbnMuSW1hZ2VDcm9wcGVyV2lkdGggLyB0aGlzLm9wdGlvbnMuSW1hZ2VDcm9wcGVySGVpZ2h0LFxyXG4gICAgICAgIGRyYWdNb2RlOiAnbW92ZScsXHJcbiAgICAgICAgYmFja2dyb3VuZDogdHJ1ZSxcclxuICAgICAgICBtb3ZhYmxlOiB0cnVlLFxyXG4gICAgICAgIHJvdGF0YWJsZTogdHJ1ZSxcclxuICAgICAgICBzY2FsYWJsZTogdHJ1ZSxcclxuICAgICAgICB6b29tYWJsZTogdHJ1ZSxcclxuICAgICAgICB2aWV3TW9kZTogMSxcclxuICAgICAgICBjaGVja0ltYWdlT3JpZ2luOiB0cnVlLFxyXG4gICAgICAgIG1vZGFsOiB0cnVlLFxyXG4gICAgICAgIGNoZWNrQ3Jvc3NPcmlnaW46IGZhbHNlLFxyXG4gICAgICAgIHdpZHRoOiB0aGlzLm9wdGlvbnMuSW1hZ2VDcm9wcGVyV2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiB0aGlzLm9wdGlvbnMuSW1hZ2VDcm9wcGVySGVpZ2h0LFxyXG4gICAgICAgIGNyb3BCb3hSZXNpemFibGU6IGZhbHNlLFxyXG4gICAgICAgIGF1dG9Dcm9wOiB0cnVlXHJcblxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLlZhbHVlICE9IG51bGwpIHtcclxuXHJcbiAgICAgIGxldCBpbWdVUkwgPSB0aGlzLm9wdGlvbnMuVmFsdWVbXCJmaWxlVVJMXCJdO1xyXG4gICAgICBpZiAoaW1nVVJMICE9IFwiXCIgJiYgaW1nVVJMICE9IHVuZGVmaW5lZCAmJiBpbWdVUkwgIT0gbnVsbClcclxuICAgICAgICB0aGlzLkltYWdlU291cmNlID0gaW1nVVJMO1xyXG5cclxuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuVmFsdWU7XHJcbiAgICAgIHRoaXMuRmlsZUxpa2VPYmplY3QgPSBuZXcgRmlsZUxpa2VPYmplY3Qoe1xyXG4gICAgICAgIG5hbWU6IGVsZW1lbnQuRmlsZU5hbWUsXHJcbiAgICAgICAgc2l6ZTogZWxlbWVudC5GaWxlU2l6ZUluTUIgKiAxMDAwICogMTAwMCxcclxuICAgICAgICB0eXBlOiBlbGVtZW50LkZpbGVUeXBlXHJcbiAgICAgIH0pXHJcbiAgICAgIHRoaXMudXBsb2FkZXIuYWRkVG9RdWV1ZShbdGhpcy5GaWxlTGlrZU9iamVjdCBhcyBhbnldKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBUeXBlID0gdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMuQWNjZXB0ZWRUeXBlID0gdGhpcy5BY2NlcHRlZFR5cGUgKyBUeXBlXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5BY2NlcHRlZFR5cGVBcnJheSA9IHRoaXMuQWNjZXB0ZWRUeXBlLnNwbGl0KFwiLFwiKVxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5BY2NlcHRlZFR5cGVBcnJheS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5BY2NlcHRlZFR5cGVBcnJheVtpbmRleF07XHJcbiAgICAgICAgY29uc3QgVHlwZVRvb2xUaXBlID0gZWxlbWVudC5zcGxpdCgnLycpWzFdO1xyXG4gICAgICAgIHRoaXMuVG9vbFRpcFR5cGVBcnJheS5wdXNoKFR5cGVUb29sVGlwZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSA9IHRoaXMuVmFsaWRhdGlvbk1lc3NhZ2UgKyBgIEFsbG93ZWQgZXh0ZW5zdGlvbnMgKCR7dGhpcy5Ub29sVGlwVHlwZUFycmF5fSkgYFxyXG5cclxuICAgIH1cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CID4gMCkge1xyXG4gICAgICB0aGlzLlZhbGlkYXRpb25NZXNzYWdlID0gdGhpcy5WYWxpZGF0aW9uTWVzc2FnZSArIGAgPGJyIC8+TWF4IEZpbGUgU2l6ZSAke3RoaXMub3B0aW9ucy5GaWxlTWF4U2l6ZUluTUJ9IE1CYFxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkZpbGVVcGxvYWRBY2NlcHRzVHlwZXMubGVuZ3RoID4gMCkge1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCA9IHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBcIlwiKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuTGFiZWxWYWx1ZSA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMuTGFiZWxLZXkpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBWYWxpZGF0aW9ucyA9IHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBWYWxpZGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBWYWxpZGF0aW9uID0gVmFsaWRhdGlvbnNbaW5kZXhdO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdGlvbi5mdW5jdGlvbkJvZHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy52YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5JbWFnZVVwbGFvZGVyQ29udHJvbEhvc3QubmdTdWJtaXQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmdyb3VwLm1hcmtBbGxBc1RvdWNoZWQoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSB0cnVlXHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLk5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3RbaW5kZXhdLktleSwgdGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3RbaW5kZXhdLnZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICByZXNldEVycm9yID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UuUmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKClcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKEVycm9yTGlzdCwgdGhpcy5ncm91cCwgdGhpcy5vcHRpb25zKTtcclxuICB9XHJcblxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5yZWplY3RlZEZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LnJlamVjdGVkRmlsZXNbMF07XHJcbiAgICAgIGNvbnN0IG1heEZpbGVTaXplID0gdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiAqIDEwMDAgKiAxMDAwO1xyXG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGZpbGUudHlwZTtcclxuICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgRmlsZU1heFNpemVJbk1COiB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICsgJ00nIH0pO1xyXG4gICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuRmlsZVVwbG9hZEFjY2VwdHNUeXBlcyAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5GaWxlVXBsb2FkQWNjZXB0c1R5cGVzLmxlbmd0aCA+IDAgJiYgISh0aGlzLkFjY2VwdGVkVHlwZUFycmF5LmluY2x1ZGVzKGZpbGVUeXBlLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuQWNjZXB0ZWRUeXBlQXJyYXkuaW5jbHVkZXMoZmlsZVR5cGUudG9Mb3dlckNhc2UoKSkpKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2w7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgVG9vbFRpcFR5cGVFcnJvcjogdGhpcy5Ub29sVGlwVHlwZUFycmF5IH0pO1xyXG4gICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnF1ZXVlID0gW107XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgRmlsZXNBcnJheSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50LmFkZGVkRmlsZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5hZGRlZEZpbGVzWzBdO1xyXG4gICAgICB0aGlzLkV2ZW50RmlsZSA9IGZpbGVcclxuICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICogMTAwMCAqIDEwMDA7XHJcbiAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgbWF4RmlsZVNpemUgPSB0aGlzLm9wdGlvbnMuRmlsZU1heFNpemVJbk1CICogMTAwMCAqIDEwMDA7XHJcbiAgICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlLnR5cGU7XHJcbiAgICAgICAgaWYgKGZpbGUuc2l6ZSA+IG1heEZpbGVTaXplKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbDtcclxuICAgICAgICAgIGZvcm1Db250cm9sLnNldEVycm9ycyh7IEZpbGVNYXhTaXplSW5NQjogdGhpcy5vcHRpb25zLkZpbGVNYXhTaXplSW5NQiArICdNJyB9KTtcclxuICAgICAgICAgIGZvcm1Db250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgICAgIHRoaXMudXBsb2FkZXIucXVldWUgPSBbXTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgbGV0IEZpbGVPYmplY3QgPSBmaWxlO1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKEZpbGVPYmplY3QpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLkFsbG93SW1hZ2VDcm9wcGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VVcmwgPSByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3Blbk1vZGFsKHRydWUpXHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBGaWxlT2JqZWN0OkZpbGVEVE89e1xyXG4gICAgICAgICAgICAgIEZpbGVOYW1lOiBmaWxlLm5hbWUsXHJcbiAgICAgICAgICAgICAgRmlsZVR5cGUgOiBmaWxlLnR5cGUsXHJcbiAgICAgICAgICAgICAgRmlsZUJhc2U2NCA6IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKS5zcGxpdCgnLCcpWzFdLFxyXG4gICAgICAgICAgICAgIEZpbGVTaXplSW5NQjogKChmaWxlLnNpemUgLyAxMDAwKSAvIDEwMDApLFxyXG4gICAgICAgICAgICAgIE5hbWVXaXRoRXh0ZW5zaW9uOiBmaWxlLm5hbWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICBGaWxlc0FycmF5LnB1c2goRmlsZU9iamVjdCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS5zZXRWYWx1ZShGaWxlT2JqZWN0KTtcclxuICAgICAgICAgICAgdGhpcy5maWxlcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goLi4uZXZlbnQuYWRkZWRGaWxlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLk9uQ2hhbmdlLmVtaXQodGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLnZhbHVlKVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUZyb21Db250cm9sVmFsdWUoZXZlbnQpIHtcclxuICAgIGxldCBJdGVtTGlzdCA9IHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS52YWx1ZTtcclxuICAgIHRoaXMuZmlsZXMgPSBbXTtcclxuICAgIEl0ZW1MaXN0ID0gbnVsbFxyXG4gICAgaWYgKCh0aGlzLmZpbGVzLmxlbmd0aCA9PSAwKSAmJiB0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCkge1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wuc2V0RXJyb3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgIHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbC5pbnZhbGlkXHJcbiAgICB9XHJcbiAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUoSXRlbUxpc3QpO1xyXG4gICAgdGhpcy5PbkNoYW5nZS5lbWl0KHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS52YWx1ZSlcclxuXHJcbiAgfVxyXG5cclxuICBjcm9wSW1hZ2UoKSB7XHJcbiAgICBsZXQgSW1hZ2VDcm9wcGVyT2JqZWN0ID0gdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLmdldENyb3BwZWRDYW52YXMoXHJcbiAgICAgIHtcclxuICAgICAgICB3aWR0aDogdGhpcy5vcHRpb25zLkltYWdlQ3JvcHBlcldpZHRoLFxyXG4gICAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLkltYWdlQ3JvcHBlckhlaWdodCxcclxuICAgICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIGltYWdlU21vb3RoaW5nUXVhbGl0eTogJ2hpZ2gnLFxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgSW1hZ2VDcm9wcGVyT2JqZWN0LnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdldEJsb2JGaWxlKGJsb2IpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJsb2JGaWxlKGJsb2IpIHtcclxuICAgIGxldCBGaWxlc0FycmF5ID0gW107XHJcbiAgICBsZXQgQmxvYkZpbGU7XHJcbiAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIEJsb2JGaWxlID0gYmxvYjtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKEJsb2JGaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIGxldCBGaWxlT2JqZWN0IDpGaWxlRFRPPXtcclxuICAgICAgICBGaWxlTmFtZSA6IHRoaXMuRXZlbnRGaWxlLm5hbWUsXHJcbiAgICAgICAgRmlsZVR5cGUgOiB0aGlzLkV2ZW50RmlsZS50eXBlLFxyXG4gICAgICAgIEZpbGVCYXNlNjQgOiByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkuc3BsaXQoJywnKVsxXSxcclxuICAgICAgICBGaWxlU2l6ZUluTUI6ICgoQmxvYkZpbGUuc2l6ZSAvIDEwMDApIC8gMTAwMCksXHJcbiAgICAgIH07XHJcbiAgICAgIEJsb2JGaWxlLm5hbWUgPSB0aGlzLkV2ZW50RmlsZS5uYW1lXHJcbiAgICAgIFxyXG4gICAgICBGaWxlc0FycmF5LnB1c2goRmlsZU9iamVjdCk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS5zZXRWYWx1ZShGaWxlT2JqZWN0KTtcclxuICAgICAgdGhpcy5maWxlcyA9IFtdO1xyXG4gICAgICB0aGlzLmZpbGVzLnB1c2goQmxvYkZpbGUpO1xyXG4gICAgICB0aGlzLm9wZW5Nb2RhbChmYWxzZSk7XHJcblxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICByb3RhdGVJbWFnZShkZWdyZWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLnJvdGF0ZShkZWdyZWUpXHJcbiAgfVxyXG4gIG1vdmVJbWFnZShvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcikge1xyXG4gICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLm1vdmUob2Zmc2V0WCwgb2Zmc2V0WSlcclxuICB9XHJcbiAgem9vbUltYWdlKHJhdGlvOiBudW1iZXIpIHtcclxuICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKHJhdGlvKVxyXG4gIH1cclxuXHJcblxyXG4gIG9wZW5Nb2RhbChvcGVuOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLm1kbFNhbXBsZUlzT3BlbiA9IG9wZW47XHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG5cclxuICBSZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcblxyXG4gIEFkZFJlcXVpcmVkVmFsaWRhdGlvbiA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMuSW1hZ2VVcGxvYWRGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucylcclxuICB9XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgQ3VzdG9tVmFsaWRhdGlvbilcclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbih0aGlzLkltYWdlVXBsb2FkRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gIH1cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LklzVmFsaWQodGhpcy5JbWFnZVVwbG9hZEZvcm1Db250cm9sKVxyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=