@dsivd/prestations-ng 14.5.20 → 15.0.0-beta3

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 (334) hide show
  1. package/CHANGELOG.md +33 -6
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +2 -0
  4. package/UPGRADING_V14.md +8 -11
  5. package/UPGRADING_V15.md +51 -0
  6. package/dsivd-prestations-ng-v15.0.0-beta3.tgz +0 -0
  7. package/esm2020/abstract-page-component.mjs +226 -0
  8. package/{esm2015/directives/currency-formatter.directive.js → esm2020/directives/currency-formatter.directive.mjs} +3 -3
  9. package/{esm2015/directives/formatter.module.js → esm2020/directives/formatter.module.mjs} +4 -4
  10. package/{esm2015/directives/iban-formatter.directive.js → esm2020/directives/iban-formatter.directive.mjs} +3 -3
  11. package/{esm2015/directives/ide-formatter.directive.js → esm2020/directives/ide-formatter.directive.mjs} +3 -3
  12. package/{esm2015/directives/ndc-formatter.directive.js → esm2020/directives/ndc-formatter.directive.mjs} +3 -3
  13. package/{esm2015/dsivd-prestations-ng.js → esm2020/dsivd-prestations-ng.mjs} +0 -0
  14. package/{esm2015/foehn-address/address.type.js → esm2020/foehn-address/address.type.mjs} +0 -0
  15. package/{esm2015/foehn-address/foehn-address.module.js → esm2020/foehn-address/foehn-address.module.mjs} +4 -4
  16. package/{esm2015/foehn-address/foehn-display-address.component.js → esm2020/foehn-address/foehn-display-address.component.mjs} +5 -9
  17. package/esm2020/foehn-address/foehn-input-address.component.mjs +366 -0
  18. package/esm2020/foehn-address/foehn-input-foreign-locality.component.mjs +66 -0
  19. package/{esm2015/foehn-address/foehn-input-foreign-street.component.js → esm2020/foehn-address/foehn-input-foreign-street.component.mjs} +6 -11
  20. package/esm2020/foehn-autocomplete/foehn-autocomplete.component.mjs +548 -0
  21. package/{esm2015/foehn-autocomplete/foehn-autocomplete.module.js → esm2020/foehn-autocomplete/foehn-autocomplete.module.mjs} +4 -4
  22. package/esm2020/foehn-boolean/foehn-boolean-checkbox.component.mjs +28 -0
  23. package/esm2020/foehn-boolean/foehn-boolean-radio.component.mjs +37 -0
  24. package/{esm2015/foehn-boolean/foehn-boolean.module.js → esm2020/foehn-boolean/foehn-boolean.module.mjs} +4 -4
  25. package/{esm2015/foehn-breadcrumb/breadcrumb-event.service.js → esm2020/foehn-breadcrumb/breadcrumb-event.service.mjs} +10 -10
  26. package/{esm2015/foehn-breadcrumb/breadcrumb.js → esm2020/foehn-breadcrumb/breadcrumb.mjs} +0 -0
  27. package/{esm2015/foehn-breadcrumb/foehn-breadcrumb.component.js → esm2020/foehn-breadcrumb/foehn-breadcrumb.component.mjs} +5 -9
  28. package/{esm2015/foehn-breadcrumb/foehn-breadcrumb.module.js → esm2020/foehn-breadcrumb/foehn-breadcrumb.module.mjs} +4 -4
  29. package/esm2020/foehn-checkables/foehn-checkable-group.component.mjs +283 -0
  30. package/{esm2015/foehn-checkables/foehn-checkables.module.js → esm2020/foehn-checkables/foehn-checkables.module.mjs} +4 -4
  31. package/esm2020/foehn-checkables/foehn-checkbox.component.mjs +36 -0
  32. package/esm2020/foehn-checkables/foehn-radio.component.mjs +63 -0
  33. package/esm2020/foehn-checkables/foehn-select.component.mjs +62 -0
  34. package/{esm2015/foehn-checkables/form-select-option-group.js → esm2020/foehn-checkables/form-select-option-group.mjs} +0 -0
  35. package/{esm2015/foehn-checkables/form-select-option.js → esm2020/foehn-checkables/form-select-option.mjs} +0 -0
  36. package/{esm2015/foehn-confirm-modal/foehn-confirm-modal-content.js → esm2020/foehn-confirm-modal/foehn-confirm-modal-content.mjs} +0 -0
  37. package/esm2020/foehn-confirm-modal/foehn-confirm-modal.component.mjs +39 -0
  38. package/{esm2015/foehn-confirm-modal/foehn-confirm-modal.module.js → esm2020/foehn-confirm-modal/foehn-confirm-modal.module.mjs} +4 -4
  39. package/{esm2015/foehn-confirm-modal/foehn-confirm-modal.service.js → esm2020/foehn-confirm-modal/foehn-confirm-modal.service.mjs} +3 -3
  40. package/{esm2015/foehn-date-picker/date-picker-navigation.helper.js → esm2020/foehn-date-picker/date-picker-navigation.helper.mjs} +7 -7
  41. package/{esm2015/foehn-date-picker/date-picker.helper.js → esm2020/foehn-date-picker/date-picker.helper.mjs} +4 -4
  42. package/{esm2015/foehn-date-picker/day-month.type.js → esm2020/foehn-date-picker/day-month.type.mjs} +0 -0
  43. package/{esm2015/foehn-date-picker/focused-day.type.js → esm2020/foehn-date-picker/focused-day.type.mjs} +0 -0
  44. package/{esm2015/foehn-date-picker/foehn-date-picker.component.js → esm2020/foehn-date-picker/foehn-date-picker.component.mjs} +22 -25
  45. package/{esm2015/foehn-date-picker/foehn-date-picker.module.js → esm2020/foehn-date-picker/foehn-date-picker.module.mjs} +4 -4
  46. package/{esm2015/foehn-date-picker/month-year.type.js → esm2020/foehn-date-picker/month-year.type.mjs} +0 -0
  47. package/esm2020/foehn-date-picker-button/foehn-date-picker-button.component.mjs +70 -0
  48. package/{esm2015/foehn-date-picker-button/foehn-date-picker-button.module.js → esm2020/foehn-date-picker-button/foehn-date-picker-button.module.mjs} +4 -4
  49. package/{esm2015/foehn-debug-summary/foehn-debug-summary.component.js → esm2020/foehn-debug-summary/foehn-debug-summary.component.mjs} +8 -11
  50. package/{esm2015/foehn-debug-summary/foehn-debug-summary.component.module.js → esm2020/foehn-debug-summary/foehn-debug-summary.component.module.mjs} +4 -4
  51. package/esm2020/foehn-decision-electronique/foehn-decision-electronique.component.mjs +36 -0
  52. package/{esm2015/foehn-decision-electronique/foehn-decision-electronique.module.js → esm2020/foehn-decision-electronique/foehn-decision-electronique.module.mjs} +4 -4
  53. package/esm2020/foehn-footer/foehn-footer.component.mjs +129 -0
  54. package/{esm2015/foehn-footer/foehn-footer.module.js → esm2020/foehn-footer/foehn-footer.module.mjs} +4 -4
  55. package/{esm2015/foehn-footer/footer-link.type.js → esm2020/foehn-footer/footer-link.type.mjs} +0 -0
  56. package/{esm2015/foehn-form/foehn-form.component.js → esm2020/foehn-form/foehn-form.component.mjs} +5 -8
  57. package/{esm2015/foehn-form/foehn-form.module.js → esm2020/foehn-form/foehn-form.module.mjs} +4 -4
  58. package/{esm2015/foehn-growl/foehn-growl.component.js → esm2020/foehn-growl/foehn-growl.component.mjs} +8 -12
  59. package/{esm2015/foehn-growl/foehn-growl.module.js → esm2020/foehn-growl/foehn-growl.module.mjs} +4 -4
  60. package/{esm2015/foehn-growl/growl-broker.service.js → esm2020/foehn-growl/growl-broker.service.mjs} +3 -3
  61. package/{esm2015/foehn-growl/growl-message.js → esm2020/foehn-growl/growl-message.mjs} +0 -0
  62. package/{esm2015/foehn-growl/growl-types.js → esm2020/foehn-growl/growl-types.mjs} +0 -0
  63. package/esm2020/foehn-header/foehn-header.component.mjs +69 -0
  64. package/{esm2015/foehn-header/foehn-header.module.js → esm2020/foehn-header/foehn-header.module.mjs} +4 -4
  65. package/{esm2015/foehn-header/foehn-skip-link.component.js → esm2020/foehn-header/foehn-skip-link.component.mjs} +5 -8
  66. package/{esm2015/foehn-help-modal/foehn-help-modal.component.js → esm2020/foehn-help-modal/foehn-help-modal.component.mjs} +5 -9
  67. package/{esm2015/foehn-help-modal/foehn-help-modal.module.js → esm2020/foehn-help-modal/foehn-help-modal.module.mjs} +4 -4
  68. package/{esm2015/foehn-help-modal/foehn-help-modal.type.js → esm2020/foehn-help-modal/foehn-help-modal.type.mjs} +0 -0
  69. package/{esm2015/foehn-icons/abstract-icon-component.js → esm2020/foehn-icons/abstract-icon-component.mjs} +4 -4
  70. package/{esm2015/foehn-icons/foehn-icon-calendar.component.js → esm2020/foehn-icons/foehn-icon-calendar.component.mjs} +5 -8
  71. package/{esm2015/foehn-icons/foehn-icon-check-square-o.component.js → esm2020/foehn-icons/foehn-icon-check-square-o.component.mjs} +5 -8
  72. package/{esm2015/foehn-icons/foehn-icon-check.component.js → esm2020/foehn-icons/foehn-icon-check.component.mjs} +5 -8
  73. package/{esm2015/foehn-icons/foehn-icon-chevron-down.component.js → esm2020/foehn-icons/foehn-icon-chevron-down.component.mjs} +5 -8
  74. package/{esm2015/foehn-icons/foehn-icon-chevron-left.component.js → esm2020/foehn-icons/foehn-icon-chevron-left.component.mjs} +5 -8
  75. package/{esm2015/foehn-icons/foehn-icon-chevron-right.component.js → esm2020/foehn-icons/foehn-icon-chevron-right.component.mjs} +5 -8
  76. package/{esm2015/foehn-icons/foehn-icon-chevron-up.component.js → esm2020/foehn-icons/foehn-icon-chevron-up.component.mjs} +5 -8
  77. package/{esm2015/foehn-icons/foehn-icon-clock.component.js → esm2020/foehn-icons/foehn-icon-clock.component.mjs} +5 -8
  78. package/{esm2015/foehn-icons/foehn-icon-comment-dots.component.js → esm2020/foehn-icons/foehn-icon-comment-dots.component.mjs} +5 -8
  79. package/{esm2015/foehn-icons/foehn-icon-edit.component.js → esm2020/foehn-icons/foehn-icon-edit.component.mjs} +5 -8
  80. package/{esm2015/foehn-icons/foehn-icon-external-link-alt.component.js → esm2020/foehn-icons/foehn-icon-external-link-alt.component.mjs} +5 -8
  81. package/{esm2015/foehn-icons/foehn-icon-file-pdf.component.js → esm2020/foehn-icons/foehn-icon-file-pdf.component.mjs} +5 -8
  82. package/{esm2015/foehn-icons/foehn-icon-info-circle.component.js → esm2020/foehn-icons/foehn-icon-info-circle.component.mjs} +5 -8
  83. package/{esm2015/foehn-icons/foehn-icon-lock.component.js → esm2020/foehn-icons/foehn-icon-lock.component.mjs} +5 -8
  84. package/{esm2015/foehn-icons/foehn-icon-map-marker.component.js → esm2020/foehn-icons/foehn-icon-map-marker.component.mjs} +5 -8
  85. package/{esm2015/foehn-icons/foehn-icon-minus-circle.component.js → esm2020/foehn-icons/foehn-icon-minus-circle.component.mjs} +5 -8
  86. package/{esm2015/foehn-icons/foehn-icon-plus-circle.component.js → esm2020/foehn-icons/foehn-icon-plus-circle.component.mjs} +5 -8
  87. package/{esm2015/foehn-icons/foehn-icon-plus-square.component.js → esm2020/foehn-icons/foehn-icon-plus-square.component.mjs} +5 -8
  88. package/{esm2015/foehn-icons/foehn-icon-search.component.js → esm2020/foehn-icons/foehn-icon-search.component.mjs} +5 -8
  89. package/{esm2015/foehn-icons/foehn-icon-times.component.js → esm2020/foehn-icons/foehn-icon-times.component.mjs} +5 -8
  90. package/{esm2015/foehn-icons/foehn-icon-trash-alt.component.js → esm2020/foehn-icons/foehn-icon-trash-alt.component.mjs} +5 -8
  91. package/{esm2015/foehn-icons/foehn-icon-unlock-alt.component.js → esm2020/foehn-icons/foehn-icon-unlock-alt.component.mjs} +5 -8
  92. package/{esm2015/foehn-icons/foehn-icons.module.js → esm2020/foehn-icons/foehn-icons.module.mjs} +4 -4
  93. package/esm2020/foehn-input/foehn-input-email.component.mjs +50 -0
  94. package/esm2020/foehn-input/foehn-input-hidden.component.mjs +53 -0
  95. package/{esm2015/foehn-input/foehn-input-number.component.js → esm2020/foehn-input/foehn-input-number.component.mjs} +10 -15
  96. package/esm2020/foehn-input/foehn-input-password.component.mjs +50 -0
  97. package/{esm2015/foehn-input/foehn-input-phone.component.js → esm2020/foehn-input/foehn-input-phone.component.mjs} +6 -11
  98. package/{esm2015/foehn-input/foehn-input-string.component.js → esm2020/foehn-input/foehn-input-string.component.mjs} +3 -3
  99. package/{esm2015/foehn-input/foehn-input-text.component.js → esm2020/foehn-input/foehn-input-text.component.mjs} +6 -11
  100. package/{esm2015/foehn-input/foehn-input-textarea.component.js → esm2020/foehn-input/foehn-input-textarea.component.mjs} +6 -11
  101. package/{esm2015/foehn-input/foehn-input.component.js → esm2020/foehn-input/foehn-input.component.mjs} +14 -14
  102. package/{esm2015/foehn-input/foehn-input.module.js → esm2020/foehn-input/foehn-input.module.mjs} +4 -4
  103. package/{esm2015/foehn-input/pattern.const.js → esm2020/foehn-input/pattern.const.mjs} +0 -0
  104. package/esm2020/foehn-input-date/foehn-input-date.component.mjs +90 -0
  105. package/esm2020/foehn-input-time/foehn-input-time.component.mjs +75 -0
  106. package/esm2020/foehn-list/foehn-list.component.mjs +128 -0
  107. package/{esm2015/foehn-list/foehn-list.module.js → esm2020/foehn-list/foehn-list.module.mjs} +4 -4
  108. package/{esm2015/foehn-list/page-change-event.js → esm2020/foehn-list/page-change-event.mjs} +0 -0
  109. package/esm2020/foehn-menu-prestation/abstract-list-item-detail-page.component.mjs +122 -0
  110. package/{esm2015/foehn-menu-prestation/abstract-menu-page.component.js → esm2020/foehn-menu-prestation/abstract-menu-page.component.mjs} +3 -3
  111. package/{esm2015/foehn-menu-prestation/abstract-page-from-menu.component.js → esm2020/foehn-menu-prestation/abstract-page-from-menu.component.mjs} +3 -3
  112. package/{esm2015/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.js → esm2020/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.mjs} +5 -8
  113. package/{esm2015/foehn-menu-prestation/foehn-list-summary/foehn-list-item-description.js → esm2020/foehn-menu-prestation/foehn-list-summary/foehn-list-item-description.mjs} +0 -0
  114. package/{esm2015/foehn-menu-prestation/foehn-list-summary/foehn-list-item.js → esm2020/foehn-menu-prestation/foehn-list-summary/foehn-list-item.mjs} +0 -0
  115. package/esm2020/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.mjs +71 -0
  116. package/esm2020/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.mjs +35 -0
  117. package/{esm2015/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.js → esm2020/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.mjs} +5 -8
  118. package/{esm2015/foehn-menu-prestation/foehn-menu-prestation.module.js → esm2020/foehn-menu-prestation/foehn-menu-prestation.module.mjs} +4 -4
  119. package/{esm2015/foehn-misc/foehn-abbr.component.js → esm2020/foehn-misc/foehn-abbr.component.mjs} +5 -9
  120. package/{esm2015/foehn-misc/foehn-misc.module.js → esm2020/foehn-misc/foehn-misc.module.mjs} +4 -4
  121. package/esm2020/foehn-modal/foehn-modal.component.mjs +96 -0
  122. package/{esm2015/foehn-modal/foehn-modal.module.js → esm2020/foehn-modal/foehn-modal.module.mjs} +4 -4
  123. package/esm2020/foehn-nav13/foehn-input-nav13.component.mjs +94 -0
  124. package/{esm2015/foehn-nav13/foehn-input-nav13.module.js → esm2020/foehn-nav13/foehn-input-nav13.module.mjs} +4 -4
  125. package/esm2020/foehn-navigation/foehn-navigation.component.mjs +94 -0
  126. package/{esm2015/foehn-navigation/foehn-navigation.module.js → esm2020/foehn-navigation/foehn-navigation.module.mjs} +4 -4
  127. package/{esm2015/foehn-navigation/foehn-navigation.service.js → esm2020/foehn-navigation/foehn-navigation.service.mjs} +12 -12
  128. package/{esm2015/foehn-notfound/foehn-notfound.component.js → esm2020/foehn-notfound/foehn-notfound.component.mjs} +5 -8
  129. package/{esm2015/foehn-notfound/foehn-notfound.module.js → esm2020/foehn-notfound/foehn-notfound.module.mjs} +4 -4
  130. package/{esm2015/foehn-page/foehn-page-counter.component.js → esm2020/foehn-page/foehn-page-counter.component.mjs} +5 -8
  131. package/esm2020/foehn-page/foehn-page-modal.component.mjs +52 -0
  132. package/{esm2015/foehn-page/foehn-page-modal.service.js → esm2020/foehn-page/foehn-page-modal.service.mjs} +3 -3
  133. package/esm2020/foehn-page/foehn-page.component.mjs +215 -0
  134. package/{esm2015/foehn-page/foehn-page.module.js → esm2020/foehn-page/foehn-page.module.mjs} +4 -4
  135. package/{esm2015/foehn-page/foehn-page.service.js → esm2020/foehn-page/foehn-page.service.mjs} +4 -4
  136. package/{esm2015/foehn-recap-section/foehn-recap-section.component.js → esm2020/foehn-recap-section/foehn-recap-section.component.mjs} +5 -8
  137. package/{esm2015/foehn-recap-section/foehn-recap-section.module.js → esm2020/foehn-recap-section/foehn-recap-section.module.mjs} +4 -4
  138. package/{esm2015/foehn-recap-section/foehn-recap-section.type.js → esm2020/foehn-recap-section/foehn-recap-section.type.mjs} +0 -0
  139. package/{esm2015/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.js → esm2020/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.mjs} +5 -9
  140. package/{esm2015/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.module.js → esm2020/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.module.mjs} +4 -4
  141. package/esm2020/foehn-status-progress-bar/foehn-status-progress-bar.component.mjs +37 -0
  142. package/{esm2015/foehn-status-progress-bar/foehn-status-progress-bar.module.js → esm2020/foehn-status-progress-bar/foehn-status-progress-bar.module.mjs} +4 -4
  143. package/{esm2015/foehn-table/foehn-table-column-configuration.js → esm2020/foehn-table/foehn-table-column-configuration.mjs} +0 -0
  144. package/{esm2015/foehn-table/foehn-table-page-change-event.js → esm2020/foehn-table/foehn-table-page-change-event.mjs} +0 -0
  145. package/esm2020/foehn-table/foehn-table.component.mjs +147 -0
  146. package/{esm2015/foehn-table/foehn-table.module.js → esm2020/foehn-table/foehn-table.module.mjs} +4 -4
  147. package/{esm2015/foehn-table/tableSort.js → esm2020/foehn-table/tableSort.mjs} +0 -0
  148. package/{esm2015/foehn-upload/abstract-foehn-uploader.component.js → esm2020/foehn-upload/abstract-foehn-uploader.component.mjs} +17 -17
  149. package/{esm2015/foehn-upload/document-reference.js → esm2020/foehn-upload/document-reference.mjs} +0 -0
  150. package/{esm2015/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.js → esm2020/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.mjs} +3 -3
  151. package/{esm2015/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.type.js → esm2020/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.type.mjs} +0 -0
  152. package/esm2020/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.mjs +165 -0
  153. package/{esm2015/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.js → esm2020/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.mjs} +4 -4
  154. package/esm2020/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.mjs +214 -0
  155. package/{esm2015/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.js → esm2020/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.mjs} +4 -4
  156. package/{esm2015/foehn-upload/foehn-multi-upload/multi-upload.service.js → esm2020/foehn-upload/foehn-multi-upload/multi-upload.service.mjs} +3 -3
  157. package/{esm2015/foehn-upload/foehn-multi-upload/multi-upload.type.js → esm2020/foehn-upload/foehn-multi-upload/multi-upload.type.mjs} +0 -0
  158. package/{esm2015/foehn-upload/foehn-multi-upload/pending-upload.service.js → esm2020/foehn-upload/foehn-multi-upload/pending-upload.service.mjs} +3 -3
  159. package/esm2020/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.mjs +163 -0
  160. package/{esm2015/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.js → esm2020/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.mjs} +4 -4
  161. package/{esm2015/foehn-upload/pending-upload.type.js → esm2020/foehn-upload/pending-upload.type.mjs} +0 -0
  162. package/esm2020/foehn-upload/uploader.helper.mjs +326 -0
  163. package/{esm2015/foehn-user-connected-as/foehn-user-connected-as.component.js → esm2020/foehn-user-connected-as/foehn-user-connected-as.component.mjs} +5 -8
  164. package/{esm2015/foehn-user-connected-as/foehn-user-connected-as.module.js → esm2020/foehn-user-connected-as/foehn-user-connected-as.module.mjs} +4 -4
  165. package/{esm2015/foehn-validation-alert-summary/foehn-validation-alert-summary.component.js → esm2020/foehn-validation-alert-summary/foehn-validation-alert-summary.component.mjs} +5 -9
  166. package/{esm2015/foehn-validation-alert-summary/foehn-validation-alert-summary.module.js → esm2020/foehn-validation-alert-summary/foehn-validation-alert-summary.module.mjs} +4 -4
  167. package/esm2020/foehn-validation-alerts/foehn-validation-alerts.component.mjs +29 -0
  168. package/{esm2015/foehn-validation-alerts/foehn-validation-alerts.module.js → esm2020/foehn-validation-alerts/foehn-validation-alerts.module.mjs} +4 -4
  169. package/esm2020/form-error.mjs +2 -0
  170. package/esm2020/form-post-response.mjs +10 -0
  171. package/{esm2015/gesdem/gesdem-error-handler.service.js → esm2020/gesdem/gesdem-error-handler.service.mjs} +3 -3
  172. package/esm2020/gesdem/gesdem-event.service.mjs +38 -0
  173. package/esm2020/gesdem/gesdem-handler.service.mjs +151 -0
  174. package/{esm2015/gesdem/gesdem-loader.guard.js → esm2020/gesdem/gesdem-loader.guard.mjs} +3 -3
  175. package/{esm2015/gesdem/gesdem-statut-utils.js → esm2020/gesdem/gesdem-statut-utils.mjs} +0 -0
  176. package/{esm2015/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.js → esm2020/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.mjs} +5 -10
  177. package/esm2020/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.mjs +128 -0
  178. package/{esm2015/gesdem-action-recovery/gesdem-action-recovery.module.js → esm2020/gesdem-action-recovery/gesdem-action-recovery.module.mjs} +4 -4
  179. package/esm2020/gesdem-action-recovery/gesdem-action-recovery.service.mjs +82 -0
  180. package/{esm2015/gesdem-action-recovery/reprise-info.js → esm2020/gesdem-action-recovery/reprise-info.mjs} +0 -0
  181. package/esm2020/gesdem-confirmation/gesdem-confirmation.component.mjs +189 -0
  182. package/{esm2015/gesdem-confirmation/gesdem-confirmation.module.js → esm2020/gesdem-confirmation/gesdem-confirmation.module.mjs} +4 -4
  183. package/{esm2015/gesdem-error/gesdem-error.component.js → esm2020/gesdem-error/gesdem-error.component.mjs} +5 -9
  184. package/{esm2015/gesdem-error/gesdem-error.module.js → esm2020/gesdem-error/gesdem-error.module.mjs} +4 -4
  185. package/{esm2015/helpers/object.helper.js → esm2020/helpers/object.helper.mjs} +2 -2
  186. package/{esm2015/i18n-form.js → esm2020/i18n-form.mjs} +0 -0
  187. package/{esm2015/index.js → esm2020/index.mjs} +3 -3
  188. package/{esm2015/pipes/currency.pipe.js → esm2020/pipes/currency.pipe.mjs} +3 -3
  189. package/{esm2015/pipes/date.pipe.js → esm2020/pipes/date.pipe.mjs} +3 -3
  190. package/{esm2015/pipes/formatIde.pipe.js → esm2020/pipes/formatIde.pipe.mjs} +3 -3
  191. package/{esm2015/pipes/pipes.module.js → esm2020/pipes/pipes.module.mjs} +4 -4
  192. package/{esm2015/prestations-ng-core.module.js → esm2020/prestations-ng-core.module.mjs} +4 -4
  193. package/{esm2015/sdk-appinfo/application-info.js → esm2020/sdk-appinfo/application-info.mjs} +0 -0
  194. package/esm2020/sdk-appinfo/application-info.service.mjs +102 -0
  195. package/{esm2015/sdk-currency/currency.helper.js → esm2020/sdk-currency/currency.helper.mjs} +3 -3
  196. package/esm2020/sdk-date/date.helper.mjs +91 -0
  197. package/{esm2015/sdk-dictionary/default-dictionary.js → esm2020/sdk-dictionary/default-dictionary.mjs} +0 -0
  198. package/{esm2015/sdk-dictionary/sdk-dictionary.module.js → esm2020/sdk-dictionary/sdk-dictionary.module.mjs} +4 -4
  199. package/{esm2015/sdk-dictionary/sdk-dictionary.pipe.js → esm2020/sdk-dictionary/sdk-dictionary.pipe.mjs} +5 -5
  200. package/{esm2015/sdk-dictionary/sdk-dictionary.service.js → esm2020/sdk-dictionary/sdk-dictionary.service.mjs} +3 -3
  201. package/{esm2015/sdk-epayment/model/EPaymentParameters.js → esm2020/sdk-epayment/model/EPaymentParameters.mjs} +0 -0
  202. package/esm2020/sdk-epayment/sdk-epayment.component.mjs +79 -0
  203. package/{esm2015/sdk-epayment/sdk-epayment.module.js → esm2020/sdk-epayment/sdk-epayment.module.mjs} +4 -4
  204. package/esm2020/sdk-epayment/sdk-epayment.service.mjs +51 -0
  205. package/{esm2015/sdk-recaptcha/grecaptcha/grecaptcha.component.js → esm2020/sdk-recaptcha/grecaptcha/grecaptcha.component.mjs} +5 -9
  206. package/esm2020/sdk-recaptcha/recaptcha.service.mjs +162 -0
  207. package/esm2020/sdk-recaptcha/sdk-recaptcha.component.mjs +68 -0
  208. package/{esm2015/sdk-recaptcha/sdk-recaptcha.module.js → esm2020/sdk-recaptcha/sdk-recaptcha.module.mjs} +4 -4
  209. package/{esm2015/sdk-redirect/iam-expired-interceptor.service.js → esm2020/sdk-redirect/iam-expired-interceptor.service.mjs} +3 -3
  210. package/{esm2015/sdk-redirect/redirect.component.js → esm2020/sdk-redirect/redirect.component.mjs} +5 -9
  211. package/{esm2015/sdk-redirect/sdk-redirect.module.js → esm2020/sdk-redirect/sdk-redirect.module.mjs} +4 -4
  212. package/{esm2015/sdk-session-info/session-info-data.js → esm2020/sdk-session-info/session-info-data.mjs} +1 -1
  213. package/{esm2015/sdk-session-info/session-info-with-application.service.js → esm2020/sdk-session-info/session-info-with-application.service.mjs} +3 -3
  214. package/esm2020/sdk-session-info/session-info.service.mjs +73 -0
  215. package/{esm2015/sdk-support-alert/support-alert-container.component.js → esm2020/sdk-support-alert/support-alert-container.component.mjs} +5 -9
  216. package/esm2020/sdk-support-alert/support-alert.component.mjs +34 -0
  217. package/{esm2015/sdk-support-alert/support-alert.model.js → esm2020/sdk-support-alert/support-alert.model.mjs} +0 -0
  218. package/{esm2015/sdk-support-alert/support-alert.module.js → esm2020/sdk-support-alert/support-alert.module.mjs} +4 -4
  219. package/{esm2015/sdk-support-alert/support-alert.service.js → esm2020/sdk-support-alert/support-alert.service.mjs} +3 -3
  220. package/{esm2015/service-locator.js → esm2020/service-locator.mjs} +0 -0
  221. package/esm2020/supported-browser.mjs +2 -0
  222. package/esm2020/validation/validation-handler.service.mjs +44 -0
  223. package/fesm2015/{dsivd-prestations-ng.js → dsivd-prestations-ng.mjs} +973 -1300
  224. package/fesm2015/dsivd-prestations-ng.mjs.map +1 -0
  225. package/fesm2020/dsivd-prestations-ng.mjs +11532 -0
  226. package/fesm2020/dsivd-prestations-ng.mjs.map +1 -0
  227. package/foehn-breadcrumb/breadcrumb-event.service.d.ts +2 -2
  228. package/foehn-checkables/foehn-checkable-group.component.d.ts +3 -3
  229. package/foehn-confirm-modal/foehn-confirm-modal.component.d.ts +1 -1
  230. package/foehn-date-picker/date-picker-navigation.helper.d.ts +1 -1
  231. package/foehn-date-picker/date-picker.helper.d.ts +1 -1
  232. package/foehn-date-picker/foehn-date-picker.component.d.ts +3 -3
  233. package/foehn-date-picker-button/foehn-date-picker-button.component.d.ts +2 -2
  234. package/foehn-debug-summary/foehn-debug-summary.component.d.ts +1 -1
  235. package/foehn-growl/foehn-growl.component.d.ts +1 -1
  236. package/foehn-header/foehn-header.component.d.ts +2 -2
  237. package/foehn-input/foehn-input-number.component.d.ts +1 -1
  238. package/foehn-input/foehn-input.component.d.ts +4 -4
  239. package/foehn-list/foehn-list.component.d.ts +2 -2
  240. package/foehn-menu-prestation/abstract-list-item-detail-page.component.d.ts +1 -1
  241. package/foehn-modal/foehn-modal.component.d.ts +1 -1
  242. package/foehn-navigation/foehn-navigation.service.d.ts +2 -2
  243. package/foehn-page/foehn-page.service.d.ts +2 -2
  244. package/foehn-table/foehn-table.component.d.ts +2 -2
  245. package/foehn-upload/abstract-foehn-uploader.component.d.ts +2 -2
  246. package/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.d.ts +1 -1
  247. package/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.d.ts +2 -2
  248. package/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.d.ts +1 -1
  249. package/foehn-upload/uploader.helper.d.ts +12 -12
  250. package/foehn-validation-alerts/foehn-validation-alerts.component.d.ts +3 -3
  251. package/{error-template.d.ts → form-error.d.ts} +1 -1
  252. package/form-post-response.d.ts +17 -0
  253. package/gesdem/gesdem-event.service.d.ts +6 -6
  254. package/gesdem/gesdem-handler.service.d.ts +3 -3
  255. package/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.d.ts +2 -2
  256. package/gesdem-action-recovery/gesdem-action-recovery.service.d.ts +2 -2
  257. package/gesdem-confirmation/gesdem-confirmation.component.d.ts +4 -4
  258. package/index.d.ts +2 -2
  259. package/package.json +26 -13
  260. package/schematics/ng-add/index.js +6 -6
  261. package/schematics/ng-update/migrations/update-13_1_0/index.js +2 -2
  262. package/schematics/ng-update/migrations/update-13_2_0/index.js +3 -3
  263. package/schematics/ng-update/migrations/update-13_5_1/index.js +2 -2
  264. package/schematics/ng-update/migrations/update-14_5_0/index.js +2 -2
  265. package/schematics/update-karma-config/index.js +2 -2
  266. package/schematics/utility/migrate-to-karma-coverage.js +3 -3
  267. package/sdk-appinfo/application-info.service.d.ts +2 -2
  268. package/sdk-epayment/sdk-epayment.component.d.ts +3 -13
  269. package/sdk-epayment/sdk-epayment.service.d.ts +2 -5
  270. package/sdk-recaptcha/recaptcha.service.d.ts +2 -2
  271. package/sdk-recaptcha/sdk-recaptcha.component.d.ts +2 -2
  272. package/sdk-session-info/session-info-data.d.ts +0 -1
  273. package/sdk-session-info/session-info.service.d.ts +9 -2
  274. package/validation/validation-handler.service.d.ts +4 -4
  275. package/backend-response.d.ts +0 -18
  276. package/bundles/dsivd-prestations-ng.umd.js +0 -13472
  277. package/bundles/dsivd-prestations-ng.umd.js.map +0 -1
  278. package/dsivd-prestations-ng-v14.5.20.tgz +0 -0
  279. package/esm2015/abstract-page-component.js +0 -224
  280. package/esm2015/backend-response.js +0 -10
  281. package/esm2015/error-template.js +0 -2
  282. package/esm2015/foehn-address/foehn-input-address.component.js +0 -365
  283. package/esm2015/foehn-address/foehn-input-foreign-locality.component.js +0 -71
  284. package/esm2015/foehn-autocomplete/foehn-autocomplete.component.js +0 -556
  285. package/esm2015/foehn-boolean/foehn-boolean-checkbox.component.js +0 -32
  286. package/esm2015/foehn-boolean/foehn-boolean-radio.component.js +0 -41
  287. package/esm2015/foehn-checkables/foehn-checkable-group.component.js +0 -294
  288. package/esm2015/foehn-checkables/foehn-checkbox.component.js +0 -40
  289. package/esm2015/foehn-checkables/foehn-radio.component.js +0 -67
  290. package/esm2015/foehn-checkables/foehn-select.component.js +0 -66
  291. package/esm2015/foehn-confirm-modal/foehn-confirm-modal.component.js +0 -42
  292. package/esm2015/foehn-date-picker-button/foehn-date-picker-button.component.js +0 -74
  293. package/esm2015/foehn-decision-electronique/foehn-decision-electronique.component.js +0 -40
  294. package/esm2015/foehn-footer/foehn-footer.component.js +0 -132
  295. package/esm2015/foehn-header/foehn-header.component.js +0 -73
  296. package/esm2015/foehn-input/foehn-input-email.component.js +0 -55
  297. package/esm2015/foehn-input/foehn-input-hidden.component.js +0 -57
  298. package/esm2015/foehn-input/foehn-input-password.component.js +0 -55
  299. package/esm2015/foehn-input-date/foehn-input-date.component.js +0 -94
  300. package/esm2015/foehn-input-time/foehn-input-time.component.js +0 -79
  301. package/esm2015/foehn-list/foehn-list.component.js +0 -134
  302. package/esm2015/foehn-menu-prestation/abstract-list-item-detail-page.component.js +0 -122
  303. package/esm2015/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.js +0 -75
  304. package/esm2015/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.js +0 -38
  305. package/esm2015/foehn-modal/foehn-modal.component.js +0 -100
  306. package/esm2015/foehn-nav13/foehn-input-nav13.component.js +0 -98
  307. package/esm2015/foehn-navigation/foehn-navigation.component.js +0 -98
  308. package/esm2015/foehn-page/foehn-page-modal.component.js +0 -55
  309. package/esm2015/foehn-page/foehn-page.component.js +0 -217
  310. package/esm2015/foehn-status-progress-bar/foehn-status-progress-bar.component.js +0 -42
  311. package/esm2015/foehn-table/foehn-table.component.js +0 -151
  312. package/esm2015/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.js +0 -171
  313. package/esm2015/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.js +0 -220
  314. package/esm2015/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.js +0 -167
  315. package/esm2015/foehn-upload/uploader.helper.js +0 -322
  316. package/esm2015/foehn-validation-alerts/foehn-validation-alerts.component.js +0 -32
  317. package/esm2015/gesdem/gesdem-event.service.js +0 -38
  318. package/esm2015/gesdem/gesdem-handler.service.js +0 -151
  319. package/esm2015/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.js +0 -133
  320. package/esm2015/gesdem-action-recovery/gesdem-action-recovery.service.js +0 -82
  321. package/esm2015/gesdem-confirmation/gesdem-confirmation.component.js +0 -194
  322. package/esm2015/sdk-appinfo/application-info.service.js +0 -111
  323. package/esm2015/sdk-date/date.helper.js +0 -90
  324. package/esm2015/sdk-epayment/model/EPaymentRequest.js +0 -3
  325. package/esm2015/sdk-epayment/sdk-epayment.component.js +0 -113
  326. package/esm2015/sdk-epayment/sdk-epayment.service.js +0 -46
  327. package/esm2015/sdk-recaptcha/recaptcha.service.js +0 -162
  328. package/esm2015/sdk-recaptcha/sdk-recaptcha.component.js +0 -72
  329. package/esm2015/sdk-session-info/session-info.service.js +0 -44
  330. package/esm2015/sdk-support-alert/support-alert.component.js +0 -38
  331. package/esm2015/supported-browser.js +0 -2
  332. package/esm2015/validation/validation-handler.service.js +0 -44
  333. package/fesm2015/dsivd-prestations-ng.js.map +0 -1
  334. package/sdk-epayment/model/EPaymentRequest.d.ts +0 -5
@@ -0,0 +1,214 @@
1
+ import { Component, forwardRef, Input } from '@angular/core';
2
+ import { filter, mergeMap, tap, throttleTime } from 'rxjs/operators';
3
+ import { AbstractFoehnUploaderComponent } from '../abstract-foehn-uploader.component';
4
+ import { FoehnInputComponent } from '../../foehn-input/foehn-input.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./multi-upload.service";
7
+ import * as i2 from "./pending-upload.service";
8
+ import * as i3 from "../../sdk-appinfo/application-info.service";
9
+ import * as i4 from "../../foehn-confirm-modal/foehn-confirm-modal.service";
10
+ import * as i5 from "../../sdk-dictionary/sdk-dictionary.service";
11
+ import * as i6 from "../../foehn-validation-alerts/foehn-validation-alerts.component";
12
+ import * as i7 from "../../foehn-icons/foehn-icon-times.component";
13
+ import * as i8 from "@angular/common";
14
+ import * as i9 from "@angular/forms";
15
+ import * as i10 from "../../sdk-dictionary/sdk-dictionary.pipe";
16
+ export class FoehnMultiUploadComponent extends AbstractFoehnUploaderComponent {
17
+ constructor(multiUploadService, pendingUploadService, applicationInfoService, confirmModalService, dictionaryService) {
18
+ super(applicationInfoService, confirmModalService, dictionaryService);
19
+ this.applicationInfoService = applicationInfoService;
20
+ this.confirmModalService = confirmModalService;
21
+ this.dictionaryService = dictionaryService;
22
+ this.url = 'api/document';
23
+ this.shouldDisplayFileSavedConfirmation = true;
24
+ this.pendingUploadService = pendingUploadService;
25
+ this.multiUploadService = multiUploadService;
26
+ }
27
+ get pendingFiles() {
28
+ return this.pendingUploadService.getPendingFiles(this.name);
29
+ }
30
+ ngOnInit() {
31
+ super.ngOnInit();
32
+ this.pendingUploadedErrorsSubscription = this.pendingUploadService.pendingUploadedErrors.subscribe((response) => {
33
+ this.displayPendingUploadedErrorsFromServerByFormKey(response.errors, this.name);
34
+ });
35
+ // Add files logic
36
+ this.uploadFilesSubscription = this.uploadFilesSubject
37
+ .pipe(filter(files => !!files),
38
+ // Only one call every 300ms to stop concurrent access
39
+ throttleTime(300),
40
+ // Only one concurrent call at the time
41
+ mergeMap(files => this.multiUploadService.uploadDocuments(this.url, this.name, this.label, files, this.key, this.multiple, this.currentLanguage, this.shouldDisplayFileSavedConfirmation), 1))
42
+ .subscribe(({ documents, errors }) => {
43
+ this.displayResultFromServer(documents, errors);
44
+ }, (error) => {
45
+ const errors = [];
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ const { status } = error;
48
+ this.uploaderHelper.addCustomErrorOrDefault(this.name, errors, `${status}`, '', this.customErrors, this.overrideMaxSizeInMo, this.overrideAcceptedExtensions, this.overrideMaxFileNameLength, this.overrideIllegalCharacters);
49
+ this.refreshErrors([errors, true]);
50
+ });
51
+ // Delete document logic
52
+ this.deleteDocumentSubscription = this.deleteDocumentSubject
53
+ .pipe(filter(document => !!document),
54
+ // Only one call every 300 ms to stop concurrent access
55
+ throttleTime(300),
56
+ // Only one concurrent call at the time
57
+ mergeMap(document => this.multiUploadService.deleteDocument(this.url, document), 1),
58
+ // Side effect once the document has been deleted.
59
+ tap(document => this.removeDocumentFromModel(document)))
60
+ .subscribe();
61
+ }
62
+ ngOnDestroy() {
63
+ super.ngOnDestroy();
64
+ if (!!this.pendingUploadedErrorsSubscription) {
65
+ this.pendingUploadedErrorsSubscription.unsubscribe();
66
+ }
67
+ }
68
+ trackByPending(pending) {
69
+ return pending.lastModified;
70
+ }
71
+ canAddMoreFiles() {
72
+ if (this.readonly) {
73
+ return false;
74
+ }
75
+ if (this.multiple) {
76
+ return true;
77
+ }
78
+ if (this.model && !!this.model.length) {
79
+ return false;
80
+ }
81
+ return !this.pendingUploadService.hasPendingFiles(this.name);
82
+ }
83
+ onFileChange(event) {
84
+ // PRESTAKIT-309: Mark as pristine so errors can be shown directly to user when uploading file
85
+ this.markAsPristine();
86
+ const target = event.target;
87
+ this.populateFileItemList(target.files);
88
+ target.value = null; // reset hidden file input values
89
+ }
90
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
91
+ onDrop(event) {
92
+ this.uploaderHelper.preventAndStop(event);
93
+ if (this.dragAndDrop) {
94
+ const fileList = this.uploaderHelper.getTransfer(event);
95
+ if (fileList) {
96
+ this.populateFileItemList(fileList);
97
+ }
98
+ this.showDropZone = false;
99
+ }
100
+ }
101
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
102
+ removeFileOnConfirmation(document) {
103
+ if (!!this.reference) {
104
+ super.removeFileOnConfirmation(document);
105
+ }
106
+ else {
107
+ // The document hasn't been uploaded.
108
+ this.pendingUploadService.removePendingFile(document, this.name);
109
+ }
110
+ }
111
+ populateFileItemList(fileList) {
112
+ let files = Array.from(fileList);
113
+ if (!files.length) {
114
+ return;
115
+ }
116
+ // When drag/drop and asked for single upload, we ensure we store only one file for upload
117
+ if (this.dragAndDrop && !this.multiple) {
118
+ files = this.manageSingleFile(files);
119
+ }
120
+ // Display local errors and stop processing
121
+ const filesErrors = this.displayLocalErrors(files);
122
+ if (filesErrors.length) {
123
+ return;
124
+ }
125
+ // Initialize model if empty
126
+ if (!this.model || !this.model.length) {
127
+ this.model = [];
128
+ }
129
+ if (!!this.reference) {
130
+ // When we have a reference, we send files to server
131
+ this.uploadFilesSubject.next(files);
132
+ }
133
+ else {
134
+ // PRESTAKIT-309: Simulate user interaction with component
135
+ // only when no error so isPristine is set to false for validation purpose
136
+ this.markAsDirty();
137
+ // Otherwise, we store files in pending storage
138
+ this.pendingUploadService.addPendingFiles(this.url, this.name, this.label, files, this.key, this.multiple, this.shouldDisplayFileSavedConfirmation);
139
+ }
140
+ }
141
+ displayPendingUploadedErrorsFromServerByFormKey(errors, formKey) {
142
+ const errorsByFormKey = errors.filter((error) => error.formKey === formKey);
143
+ this.displayErrorsFromServer(errorsByFormKey);
144
+ }
145
+ displayResultFromServer(documents, errors) {
146
+ this.displayErrorsFromServer(errors);
147
+ this.model = [...this.model, ...(documents || [])];
148
+ this.triggerUserInput(this.model);
149
+ }
150
+ removeDocumentFromModel(document) {
151
+ const index = this.model.indexOf(document);
152
+ if (index > -1) {
153
+ this.model.splice(index, 1);
154
+ this.model = [...this.model];
155
+ this.triggerUserInput(this.model);
156
+ }
157
+ }
158
+ displayErrorsFromServer(errors) {
159
+ if (!errors || !errors.length) {
160
+ // PRESTAKIT-309: Simulate user interaction with component
161
+ // only when no error so isPristine is set to false for validation purpose
162
+ this.markAsDirty();
163
+ return;
164
+ }
165
+ const newErrors = [];
166
+ errors.forEach(error => this.uploaderHelper.addCustomErrorOrDefault(this.name, newErrors, `${error.errorCode}`, error.label, this.customErrors, this.overrideMaxSizeInMo, this.overrideAcceptedExtensions, this.overrideMaxFileNameLength, this.overrideIllegalCharacters));
167
+ this.refreshErrors([newErrors, true]);
168
+ }
169
+ manageSingleFile(files) {
170
+ // Edge browser lets you drop files from dialog box when selecting a file.
171
+ // We need to make sure we only keep last selected file from user
172
+ if (!!this.reference) {
173
+ if (this.model && this.model.length > 0) {
174
+ const currentModelFiles = [...this.model];
175
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
+ currentModelFiles.forEach((doc) => this.removeFileOnConfirmation(doc));
177
+ }
178
+ }
179
+ else {
180
+ const currentPendingFiles = [...this.pendingFiles];
181
+ if (currentPendingFiles.length > 0) {
182
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
183
+ currentPendingFiles.forEach((doc) => this.removeFileOnConfirmation(doc));
184
+ }
185
+ }
186
+ // Then we ensure we take only one file from current selection
187
+ return files.slice(0, 1);
188
+ }
189
+ }
190
+ FoehnMultiUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnMultiUploadComponent, deps: [{ token: i1.MultiUploadService }, { token: i2.PendingUploadService }, { token: i3.ApplicationInfoService }, { token: i4.FoehnConfirmModalService }, { token: i5.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
191
+ FoehnMultiUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: FoehnMultiUploadComponent, selector: "foehn-multi-upload", inputs: { url: "url", reference: "reference", shouldDisplayFileSavedConfirmation: "shouldDisplayFileSavedConfirmation" }, providers: [
192
+ {
193
+ provide: FoehnInputComponent,
194
+ useExisting: forwardRef(() => FoehnMultiUploadComponent),
195
+ multi: true
196
+ }
197
+ ], usesInheritance: true, ngImport: i0, template: "<div\n class=\"form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [class.drop-zone-highlight]=\"showDropZone\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n (drop)=\"onDrop($event)\"\n (dragenter)=\"onDragenter($event)\"\n (dragleave)=\"onDragleave($event)\"\n (dragover)=\"onDragover($event)\"\n>\n <label\n [attr.for]=\"buildChildId()\"\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : labelStyleModifier\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts\n [component]=\"this\"\n [shouldErrorsBeLive]=\"hasLiveUploadErrors()\"\n ></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <!-- PRESTAKIT-309: Fake input with NgModel to be registered into Form controls -->\n <input type=\"hidden\" [name]=\"name || label\" [ngModel]=\"model\" />\n\n <ng-content></ng-content>\n\n <ng-container *ngIf=\"reference\">\n <div\n *ngFor=\"let document of model; trackBy: trackByDocument\"\n class=\"file file-uploaded\"\n >\n <a [href]=\"multiUploadService.getDownloadUrl(url, document)\">\n {{ document.filename }}\n </a>\n <span class=\"ml-1 mr-1\">\n ({{ toMegaOctets(document.fileSize) }}\n <abbr title=\"Megaoctet\">Mo</abbr>\n )\n </span>\n <button\n *ngIf=\"!readonly\"\n type=\"button\"\n class=\"btn icon-button delete-uploaded\"\n (click)=\"removeFile(document)\"\n >\n <foehn-icon-times\n title=\"Supprimer {{ document.filename }}\"\n ></foehn-icon-times>\n </button>\n </div>\n\n <small\n class=\"form-text text-secondary uploaded-global-info\"\n *ngIf=\"showGlobalInfos(model)\"\n [innerHTML]=\"getGlobalInfos(model)\"\n ></small>\n </ng-container>\n\n <ng-container *ngIf=\"!reference\">\n <div\n *ngFor=\"let pending of pendingFiles; trackBy: trackByPending\"\n class=\"file file-pending\"\n >\n <span>{{ pending.name }}</span>\n <span class=\"ml-1 mr-1\">\n ({{ toMegaOctets(pending.size) }}\n <abbr title=\"Megaoctet\">Mo</abbr>\n )\n </span>\n <button\n *ngIf=\"!readonly\"\n type=\"button\"\n class=\"btn icon-button delete-pending\"\n (click)=\"removeFile(pending)\"\n >\n <foehn-icon-times\n title=\"Supprimer {{ pending.name }}\"\n ></foehn-icon-times>\n </button>\n </div>\n\n <small\n class=\"form-text text-secondary pending-global-info\"\n *ngIf=\"showGlobalInfos(pendingFiles)\"\n [innerHTML]=\"getGlobalInfos(pendingFiles)\"\n ></small>\n </ng-container>\n\n <ng-container *ngIf=\"canAddMoreFiles()\">\n <input\n class=\"form-control-file actual-input\"\n type=\"file\"\n [name]=\"name || label\"\n [multiple]=\"multiple\"\n [attr.accept]=\"\n overrideAcceptedExtensions\n ? overrideAcceptedExtensions\n : uploaderHelper.accept\n ? uploaderHelper.accept\n : null\n \"\n (change)=\"onFileChange($event)\"\n #inputFile\n />\n\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'sr-only': !showUploadButton }\"\n [attr.id]=\"buildChildId()\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n [attr.aria-describedby]=\"buildId('ErrorsContainer')\"\n (click)=\"inputFile.click()\"\n #entryComponent\n >\n {{ multiple ? chooseButtonLabelMultiple : chooseButtonLabel }}\n </button>\n\n <div\n *ngIf=\"dragAndDrop\"\n aria-hidden=\"true\"\n class=\"dropfile\"\n [class.dropfile-border-transparent]=\"showDropZone\"\n (click)=\"inputFile.click()\"\n >\n {{ multiple ? dropZoneLabelMultiple : dropZoneLabel }}\n </div>\n </ng-container>\n</div>\n", styles: [".dropfile{width:300px;border:3px dashed #bbbbbb;text-align:center;margin-top:10px;cursor:pointer;padding:15px 3px}.dropfile-border-transparent{border-color:#fff}.actual-input{display:none}.file-list{margin-top:20px}.icon-button{border:0;background-color:transparent}.icon-button:hover{cursor:pointer}:host ::ng-deep .svg-inline--fa{color:#000!important}.drop-zone-highlight{outline:3px dashed #bbb}\n"], components: [{ type: i6.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { type: i7.FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": i10.SdkDictionaryPipe } });
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnMultiUploadComponent, decorators: [{
199
+ type: Component,
200
+ args: [{ selector: 'foehn-multi-upload', providers: [
201
+ {
202
+ provide: FoehnInputComponent,
203
+ useExisting: forwardRef(() => FoehnMultiUploadComponent),
204
+ multi: true
205
+ }
206
+ ], template: "<div\n class=\"form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [class.drop-zone-highlight]=\"showDropZone\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n (drop)=\"onDrop($event)\"\n (dragenter)=\"onDragenter($event)\"\n (dragleave)=\"onDragleave($event)\"\n (dragover)=\"onDragover($event)\"\n>\n <label\n [attr.for]=\"buildChildId()\"\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : labelStyleModifier\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts\n [component]=\"this\"\n [shouldErrorsBeLive]=\"hasLiveUploadErrors()\"\n ></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <!-- PRESTAKIT-309: Fake input with NgModel to be registered into Form controls -->\n <input type=\"hidden\" [name]=\"name || label\" [ngModel]=\"model\" />\n\n <ng-content></ng-content>\n\n <ng-container *ngIf=\"reference\">\n <div\n *ngFor=\"let document of model; trackBy: trackByDocument\"\n class=\"file file-uploaded\"\n >\n <a [href]=\"multiUploadService.getDownloadUrl(url, document)\">\n {{ document.filename }}\n </a>\n <span class=\"ml-1 mr-1\">\n ({{ toMegaOctets(document.fileSize) }}\n <abbr title=\"Megaoctet\">Mo</abbr>\n )\n </span>\n <button\n *ngIf=\"!readonly\"\n type=\"button\"\n class=\"btn icon-button delete-uploaded\"\n (click)=\"removeFile(document)\"\n >\n <foehn-icon-times\n title=\"Supprimer {{ document.filename }}\"\n ></foehn-icon-times>\n </button>\n </div>\n\n <small\n class=\"form-text text-secondary uploaded-global-info\"\n *ngIf=\"showGlobalInfos(model)\"\n [innerHTML]=\"getGlobalInfos(model)\"\n ></small>\n </ng-container>\n\n <ng-container *ngIf=\"!reference\">\n <div\n *ngFor=\"let pending of pendingFiles; trackBy: trackByPending\"\n class=\"file file-pending\"\n >\n <span>{{ pending.name }}</span>\n <span class=\"ml-1 mr-1\">\n ({{ toMegaOctets(pending.size) }}\n <abbr title=\"Megaoctet\">Mo</abbr>\n )\n </span>\n <button\n *ngIf=\"!readonly\"\n type=\"button\"\n class=\"btn icon-button delete-pending\"\n (click)=\"removeFile(pending)\"\n >\n <foehn-icon-times\n title=\"Supprimer {{ pending.name }}\"\n ></foehn-icon-times>\n </button>\n </div>\n\n <small\n class=\"form-text text-secondary pending-global-info\"\n *ngIf=\"showGlobalInfos(pendingFiles)\"\n [innerHTML]=\"getGlobalInfos(pendingFiles)\"\n ></small>\n </ng-container>\n\n <ng-container *ngIf=\"canAddMoreFiles()\">\n <input\n class=\"form-control-file actual-input\"\n type=\"file\"\n [name]=\"name || label\"\n [multiple]=\"multiple\"\n [attr.accept]=\"\n overrideAcceptedExtensions\n ? overrideAcceptedExtensions\n : uploaderHelper.accept\n ? uploaderHelper.accept\n : null\n \"\n (change)=\"onFileChange($event)\"\n #inputFile\n />\n\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'sr-only': !showUploadButton }\"\n [attr.id]=\"buildChildId()\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n [attr.aria-describedby]=\"buildId('ErrorsContainer')\"\n (click)=\"inputFile.click()\"\n #entryComponent\n >\n {{ multiple ? chooseButtonLabelMultiple : chooseButtonLabel }}\n </button>\n\n <div\n *ngIf=\"dragAndDrop\"\n aria-hidden=\"true\"\n class=\"dropfile\"\n [class.dropfile-border-transparent]=\"showDropZone\"\n (click)=\"inputFile.click()\"\n >\n {{ multiple ? dropZoneLabelMultiple : dropZoneLabel }}\n </div>\n </ng-container>\n</div>\n", styles: [".dropfile{width:300px;border:3px dashed #bbbbbb;text-align:center;margin-top:10px;cursor:pointer;padding:15px 3px}.dropfile-border-transparent{border-color:#fff}.actual-input{display:none}.file-list{margin-top:20px}.icon-button{border:0;background-color:transparent}.icon-button:hover{cursor:pointer}:host ::ng-deep .svg-inline--fa{color:#000!important}.drop-zone-highlight{outline:3px dashed #bbb}\n"] }]
207
+ }], ctorParameters: function () { return [{ type: i1.MultiUploadService }, { type: i2.PendingUploadService }, { type: i3.ApplicationInfoService }, { type: i4.FoehnConfirmModalService }, { type: i5.SdkDictionaryService }]; }, propDecorators: { url: [{
208
+ type: Input
209
+ }], reference: [{
210
+ type: Input
211
+ }], shouldDisplayFileSavedConfirmation: [{
212
+ type: Input
213
+ }] } });
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tbXVsdGktdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi11cGxvYWQvZm9laG4tbXVsdGktdXBsb2FkL2ZvZWhuLW11bHRpLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tdXBsb2FkL2ZvZWhuLW11bHRpLXVwbG9hZC9mb2Vobi1tdWx0aS11cGxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQVFoRixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7OztBQWM5RSxNQUFNLE9BQU8seUJBQ1QsU0FBUSw4QkFBbUQ7SUFnQjNELFlBQ0ksa0JBQXNDLEVBQ3RDLG9CQUEwQyxFQUNoQyxzQkFBOEMsRUFDOUMsbUJBQTZDLEVBQzdDLGlCQUF1QztRQUVqRCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUo1RCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBMEI7UUFDN0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQWxCckQsUUFBRyxHQUFHLGNBQWMsQ0FBQztRQU1yQix1Q0FBa0MsR0FBRyxJQUFJLENBQUM7UUFldEMsSUFBSSxDQUFDLG9CQUFvQixHQUFH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LENBQUMsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FDbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUNyQyxDQUFDO2FBQ0w7U0FDSjthQUFNO1lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25ELElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDaEMsOERBQThEO2dCQUM5RCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUNyQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQ3JDLENBQUM7YUFDTDtTQUNKO1FBQ0QsOERBQThEO1FBQzlELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7c0hBbFNRLHlCQUF5QjswR0FBekIseUJBQXlCLHVLQVJ2QjtRQUNQO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO1lBQ3hELEtBQUssRUFBRSxJQUFJO1NBQ2Q7S0FDSixpREN4QkwsK3pKQWtKQTsyRkR4SGEseUJBQXlCO2tCQVpyQyxTQUFTOytCQUNJLG9CQUFvQixhQUduQjt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7MlBBTUQsR0FBRztzQkFERixLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixrQ0FBa0M7c0JBRGpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTXVsdGlVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi9tdWx0aS11cGxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtRXJyb3IgfSBmcm9tICcuLi8uLi9mb3JtLWVycm9yJztcbmltcG9ydCB7IERvY3VtZW50RXJyb3IsIERvY3VtZW50c1dpdGhFcnJvcnMgfSBmcm9tICcuL211bHRpLXVwbG9hZC50eXBlJztcbmltcG9ydCB7IERvY3VtZW50UmVmZXJlbmNlIH0gZnJvbSAnLi4vZG9jdW1lbnQtcmVmZXJlbmNlJztcbmltcG9ydCB7IFBlbmRpbmdVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi9wZW5kaW5nLXVwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25JbmZvU2VydmljZSB9IGZyb20gJy4uLy4uL3Nkay1hcHBpbmZvL2FwcGxpY2F0aW9uLWluZm8uc2VydmljZSc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1lcmdlTWFwLCB0YXAsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZvZWhuQ29uZmlybU1vZGFsU2VydmljZSB9IGZyb20gJy4uLy4uL2ZvZWhuLWNvbmZpcm0tbW9kYWwvZm9laG4tY29uZmlybS1tb2RhbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNka0RpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2RrLWRpY3Rpb25hcnkvc2RrLWRpY3Rpb25hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEZvZWhuVXBsb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi9hYnN0cmFjdC1mb2Vobi11cGxvYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9laG5JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9laG4tbXVsdGktdXBsb2FkJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9laG4tbXVsdGktdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi4vZm9laG4tdXBsb2FkLmNvbXBvbmVudC5jc3MnXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRm9laG5JbnB1dENvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvZWhuTXVsdGlVcGxvYWRDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9laG5NdWx0aVVwbG9hZENvbXBvbmVudFxuICAgIGV4dGVuZHMgQWJzdHJhY3RGb2VoblVwbG9hZGVyQ29tcG9uZW50PERvY3VtZW50UmVmZXJlbmNlW10+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgQElucHV0KClcbiAgICB1cmwgPSAnYXBpL2RvY3VtZW50JztcblxuICAgIEBJbnB1dCgpXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHNob3VsZERpc3BsYXlGaWxlU2F2ZWRDb25maXJtYXRpb24gPSB0cnVlO1xuXG4gICAgbXVsdGlVcGxvYWRTZXJ2aWNlOiBNdWx0aVVwbG9hZFNlcnZpY2U7XG4gICAgcGVuZGluZ1VwbG9hZFNlcnZpY2U6IFBlbmRpbmdVcGxvYWRTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBwZW5kaW5nVXBsb2FkZWRFcnJvcnNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBtdWx0aVVwbG9hZFNlcnZpY2U6IE11bHRpVXBsb2FkU2VydmljZSxcbiAgICAgICAgcGVuZGluZ1VwbG9hZFNlcnZpY2U6IFBlbmRpbmdVcGxvYWRTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYXBwbGljYXRpb25JbmZvU2VydmljZTogQXBwbGljYXRpb25JbmZvU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGNvbmZpcm1Nb2RhbFNlcnZpY2U6IEZvZWhuQ29uZmlybU1vZGFsU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGRpY3Rpb25hcnlTZXJ2aWNlOiBTZGtEaWN0aW9uYXJ5U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihhcHBsaWNhdGlvbkluZm9TZXJ2aWNlLCBjb25maXJtTW9kYWxTZXJ2aWNlLCBkaWN0aW9uYXJ5U2VydmljZSk7XG4gICAgICAgIHRoaXMucGVuZGluZ1VwbG9hZFNlcnZpY2UgPSBwZW5kaW5nVXBsb2FkU2VydmljZTtcbiAgICAgICAgdGhpcy5tdWx0aVVwbG9hZFNlcnZpY2UgPSBtdWx0aVVwbG9hZFNlcnZpY2U7XG4gICAgfVxuXG4gICAgZ2V0IHBlbmRpbmdGaWxlcygpOiBGaWxlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nVXBsb2FkU2VydmljZS5nZXRQZW5kaW5nRmlsZXModGhpcy5uYW1lKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgICAgICB0aGlzLnBlbmRpbmdVcGxvYWRlZEVycm9yc1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1VwbG9hZFNlcnZpY2UucGVuZGluZ1VwbG9hZGVkRXJyb3JzLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogRG9jdW1lbnRzV2l0aEVycm9ycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheVBlbmRpbmdVcGxvYWRlZEVycm9yc0Zyb21TZXJ2ZXJCeUZvcm1LZXkoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBBZGQgZmlsZXMgbG9naWNcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlc1N1YnNjcmlwdGlvbiA9IHRoaXMudXBsb2FkRmlsZXNTdWJqZWN0XG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoZmlsZXMgPT4gISFmaWxlcyksXG4gICAgICAgICAgICAgICAgLy8gT25seSBvbmUgY2FsbCBldmVyeSAzMDBtcyB0byBzdG9wIGNvbmN1cnJlbnQgYWNjZXNzXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDMwMCksXG4gICAgICAgICAgICAgICAgLy8gT25seSBvbmUgY29uY3VycmVudCBjYWxsIGF0IHRoZSB0aW1lXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm11bHRpVXBsb2FkU2VydmljZS51cGxvYWREb2N1bWVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tdWx0aXBsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3VsZERpc3BsYXlGaWxlU2F2ZWRDb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICh7IGRvY3VtZW50cywgZXJyb3JzIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5UmVzdWx0RnJvbVNlcnZlcihkb2N1bWVudHMsIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JzOiBGb3JtRXJyb3JbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXR1cyB9OiBhbnkgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlckhlbHBlci5hZGRDdXN0b21FcnJvck9yRGVmYXVsdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3N0YXR1c31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVNYXhTaXplSW5NbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVBY2NlcHRlZEV4dGVuc2lvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJyaWRlTWF4RmlsZU5hbWVMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJyaWRlSWxsZWdhbENoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRXJyb3JzKFtlcnJvcnMsIHRydWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgIC8vIERlbGV0ZSBkb2N1bWVudCBsb2dpY1xuICAgICAgICB0aGlzLmRlbGV0ZURvY3VtZW50U3Vic2NyaXB0aW9uID0gdGhpcy5kZWxldGVEb2N1bWVudFN1YmplY3RcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihkb2N1bWVudCA9PiAhIWRvY3VtZW50KSxcbiAgICAgICAgICAgICAgICAvLyBPbmx5IG9uZSBjYWxsIGV2ZXJ5IDMwMCBtcyB0byBzdG9wIGNvbmN1cnJlbnQgYWNjZXNzXG4gICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lKDMwMCksXG4gICAgICAgICAgICAgICAgLy8gT25seSBvbmUgY29uY3VycmVudCBjYWxsIGF0IHRoZSB0aW1lXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm11bHRpVXBsb2FkU2VydmljZS5kZWxldGVEb2N1bWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgLy8gU2lkZSBlZmZlY3Qgb25jZSB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZC5cbiAgICAgICAgICAgICAgICB0YXAoZG9jdW1lbnQgPT4gdGhpcy5yZW1vdmVEb2N1bWVudEZyb21Nb2RlbChkb2N1bWVudCkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG5cbiAgICAgICAgaWYgKCEhdGhpcy5wZW5kaW5nVXBsb2FkZWRFcnJvcnNTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VwbG9hZGVkRXJyb3JzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFja0J5UGVuZGluZyhwZW5kaW5nOiBGaWxlKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcubGFzdE1vZGlmaWVkO1xuICAgIH1cblxuICAgIGNhbkFkZE1vcmVGaWxlcygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsICYmICEhdGhpcy5tb2RlbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy5wZW5kaW5nVXBsb2FkU2VydmljZS5oYXNQZW5kaW5nRmlsZXModGhpcy5uYW1lKTtcbiAgICB9XG5cbiAgICBvbkZpbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIFBSRVNUQUtJVC0zMDk6IE1hcmsgYXMgcHJpc3RpbmUgc28gZXJyb3JzIGNhbiBiZSBzaG93biBkaXJlY3RseSB0byB1c2VyIHdoZW4gdXBsb2FkaW5nIGZpbGVcbiAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldDogSFRNTElucHV0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICB0aGlzLnBvcHVsYXRlRmlsZUl0ZW1MaXN0KHRhcmdldC5maWxlcyk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IG51bGw7IC8vIHJlc2V0IGhpZGRlbiBmaWxlIGlucHV0IHZhbHVlc1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25Ecm9wKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGxvYWRlckhlbHBlci5wcmV2ZW50QW5kU3RvcChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmRyYWdBbmREcm9wKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlTGlzdDogRmlsZUxpc3QgPSB0aGlzLnVwbG9hZGVySGVscGVyLmdldFRyYW5zZmVyKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChmaWxlTGlzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVGaWxlSXRlbUxpc3QoZmlsZUxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zaG93RHJvcFpvbmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlbW92ZUZpbGVPbkNvbmZpcm1hdGlvbihkb2N1bWVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICghIXRoaXMucmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBzdXBlci5yZW1vdmVGaWxlT25Db25maXJtYXRpb24oZG9jdW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIGRvY3VtZW50IGhhc24ndCBiZWVuIHVwbG9hZGVkLlxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVXBsb2FkU2VydmljZS5yZW1vdmVQZW5kaW5nRmlsZShkb2N1bWVudCwgdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcG9wdWxhdGVGaWxlSXRlbUxpc3QoZmlsZUxpc3Q6IEZpbGVMaXN0KTogdm9pZCB7XG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20oZmlsZUxpc3QpO1xuXG4gICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaGVuIGRyYWcvZHJvcCBhbmQgYXNrZWQgZm9yIHNpbmdsZSB1cGxvYWQsIHdlIGVuc3VyZSB3ZSBzdG9yZSBvbmx5IG9uZSBmaWxlIGZvciB1cGxvYWRcbiAgICAgICAgaWYgKHRoaXMuZHJhZ0FuZERyb3AgJiYgIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGZpbGVzID0gdGhpcy5tYW5hZ2VTaW5nbGVGaWxlKGZpbGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc3BsYXkgbG9jYWwgZXJyb3JzIGFuZCBzdG9wIHByb2Nlc3NpbmdcbiAgICAgICAgY29uc3QgZmlsZXNFcnJvcnMgPSB0aGlzLmRpc3BsYXlMb2NhbEVycm9ycyhmaWxlcyk7XG4gICAgICAgIGlmIChmaWxlc0Vycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgbW9kZWwgaWYgZW1wdHlcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsIHx8ICF0aGlzLm1vZGVsLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEhdGhpcy5yZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgaGF2ZSBhIHJlZmVyZW5jZSwgd2Ugc2VuZCBmaWxlcyB0byBzZXJ2ZXJcbiAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZXNTdWJqZWN0Lm5leHQoZmlsZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUFJFU1RBS0lULTMwOTogU2ltdWxhdGUgdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gb25seSB3aGVuIG5vIGVycm9yIHNvIGlzUHJpc3RpbmUgaXMgc2V0IHRvIGZhbHNlIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VcbiAgICAgICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcblxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBzdG9yZSBmaWxlcyBpbiBwZW5kaW5nIHN0b3JhZ2VcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VwbG9hZFNlcnZpY2UuYWRkUGVuZGluZ0ZpbGVzKFxuICAgICAgICAgICAgICAgIHRoaXMudXJsLFxuICAgICAgICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsLFxuICAgICAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgICAgIHRoaXMua2V5LFxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbGUsXG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGREaXNwbGF5RmlsZVNhdmVkQ29uZmlybWF0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5UGVuZGluZ1VwbG9hZGVkRXJyb3JzRnJvbVNlcnZlckJ5Rm9ybUtleShcbiAgICAgICAgZXJyb3JzOiBEb2N1bWVudEVycm9yW10sXG4gICAgICAgIGZvcm1LZXk6IHN0cmluZ1xuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBlcnJvcnNCeUZvcm1LZXkgPSBlcnJvcnMuZmlsdGVyKFxuICAgICAgICAgICAgKGVycm9yOiBEb2N1bWVudEVycm9yKSA9PiBlcnJvci5mb3JtS2V5ID09PSBmb3JtS2V5XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yc0Zyb21TZXJ2ZXIoZXJyb3JzQnlGb3JtS2V5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3BsYXlSZXN1bHRGcm9tU2VydmVyKFxuICAgICAgICBkb2N1bWVudHM6IERvY3VtZW50UmVmZXJlbmNlW10sXG4gICAgICAgIGVycm9yczogRG9jdW1lbnRFcnJvcltdXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcGxheUVycm9yc0Zyb21TZXJ2ZXIoZXJyb3JzKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IFsuLi50aGlzLm1vZGVsLCAuLi4oZG9jdW1lbnRzIHx8IFtdKV07XG4gICAgICAgIHRoaXMudHJpZ2dlclVzZXJJbnB1dCh0aGlzLm1vZGVsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZURvY3VtZW50RnJvbU1vZGVsKGRvY3VtZW50OiBEb2N1bWVudFJlZmVyZW5jZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuaW5kZXhPZihkb2N1bWVudCk7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gWy4uLnRoaXMubW9kZWxdO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyVXNlcklucHV0KHRoaXMubW9kZWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNwbGF5RXJyb3JzRnJvbVNlcnZlcihlcnJvcnM6IERvY3VtZW50RXJyb3JbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIWVycm9ycyB8fCAhZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gUFJFU1RBS0lULTMwOTogU2ltdWxhdGUgdXNlciBpbnRlcmFjdGlvbiB3aXRoIGNvbXBvbmVudFxuICAgICAgICAgICAgLy8gb25seSB3aGVuIG5vIGVycm9yIHNvIGlzUHJpc3RpbmUgaXMgc2V0IHRvIGZhbHNlIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VcbiAgICAgICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0Vycm9yczogRm9ybUVycm9yW10gPSBbXTtcbiAgICAgICAgZXJyb3JzLmZvckVhY2goZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMudXBsb2FkZXJIZWxwZXIuYWRkQ3VzdG9tRXJyb3JPckRlZmF1bHQoXG4gICAgICAgICAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIG5ld0Vycm9ycyxcbiAgICAgICAgICAgICAgICBgJHtlcnJvci5lcnJvckNvZGV9YCxcbiAgICAgICAgICAgICAgICBlcnJvci5sYWJlbCxcbiAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUVycm9ycyxcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJyaWRlTWF4U2l6ZUluTW8sXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVycmlkZUFjY2VwdGVkRXh0ZW5zaW9ucyxcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJyaWRlTWF4RmlsZU5hbWVMZW5ndGgsXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVycmlkZUlsbGVnYWxDaGFyYWN0ZXJzXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoRXJyb3JzKFtuZXdFcnJvcnMsIHRydWVdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hbmFnZVNpbmdsZUZpbGUoZmlsZXM6IEZpbGVbXSk6IEZpbGVbXSB7XG4gICAgICAgIC8vIEVkZ2UgYnJvd3NlciBsZXRzIHlvdSBkcm9wIGZpbGVzIGZyb20gZGlhbG9nIGJveCB3aGVuIHNlbGVjdGluZyBhIGZpbGUuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIG9ubHkga2VlcCBsYXN0IHNlbGVjdGVkIGZpbGUgZnJvbSB1c2VyXG4gICAgICAgIGlmICghIXRoaXMucmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TW9kZWxGaWxlcyA9IFsuLi50aGlzLm1vZGVsXTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIGN1cnJlbnRNb2RlbEZpbGVzLmZvckVhY2goKGRvYzogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbGVPbkNvbmZpcm1hdGlvbihkb2MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQZW5kaW5nRmlsZXMgPSBbLi4udGhpcy5wZW5kaW5nRmlsZXNdO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQZW5kaW5nRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgY3VycmVudFBlbmRpbmdGaWxlcy5mb3JFYWNoKChkb2M6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWxlT25Db25maXJtYXRpb24oZG9jKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlbiB3ZSBlbnN1cmUgd2UgdGFrZSBvbmx5IG9uZSBmaWxlIGZyb20gY3VycmVudCBzZWxlY3Rpb25cbiAgICAgICAgcmV0dXJuIGZpbGVzLnNsaWNlKDAsIDEpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cImZvcm0tZ3JvdXBcIlxuICAgIFtjbGFzcy5oYXMtZGFuZ2VyXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICBbY2xhc3MudmQtZm9ybS1ncm91cC1kYW5nZXJdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KClcIlxuICAgIFtjbGFzcy5kcm9wLXpvbmUtaGlnaGxpZ2h0XT1cInNob3dEcm9wWm9uZVwiXG4gICAgW2F0dHIuaWRdPVwiYnVpbGRJZCgnQ29udGFpbmVyJylcIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuICAgIChkcm9wKT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgICAoZHJhZ2VudGVyKT1cIm9uRHJhZ2VudGVyKCRldmVudClcIlxuICAgIChkcmFnbGVhdmUpPVwib25EcmFnbGVhdmUoJGV2ZW50KVwiXG4gICAgKGRyYWdvdmVyKT1cIm9uRHJhZ292ZXIoJGV2ZW50KVwiXG4+XG4gICAgPGxhYmVsXG4gICAgICAgIFthdHRyLmZvcl09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgICpuZ0lmPVwiISFsYWJlbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlzTGFiZWxTck9ubHkgPyAnc3Itb25seScgOiBsYWJlbFN0eWxlTW9kaWZpZXJcIlxuICAgID5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXJlcXVpcmVkICYmICFoaWRlTm90UmVxdWlyZWRFeHRyYUxhYmVsXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICdmb2Vobi1pbnB1dC5vcHRpb25hbCcgfCBmcm9tRGljdGlvbmFyeSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cblxuICAgIDxmb2Vobi12YWxpZGF0aW9uLWFsZXJ0c1xuICAgICAgICBbY29tcG9uZW50XT1cInRoaXNcIlxuICAgICAgICBbc2hvdWxkRXJyb3JzQmVMaXZlXT1cImhhc0xpdmVVcGxvYWRFcnJvcnMoKVwiXG4gICAgPjwvZm9laG4tdmFsaWRhdGlvbi1hbGVydHM+XG5cbiAgICA8c21hbGxcbiAgICAgICAgKm5nSWY9XCJoZWxwVGV4dFwiXG4gICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ0hlbHAnXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1zZWNvbmRhcnlcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cImhlbHBUZXh0XCJcbiAgICA+PC9zbWFsbD5cblxuICAgIDwhLS0gUFJFU1RBS0lULTMwOTogRmFrZSBpbnB1dCB3aXRoIE5nTW9kZWwgdG8gYmUgcmVnaXN0ZXJlZCBpbnRvIEZvcm0gY29udHJvbHMgLS0+XG4gICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBbbmFtZV09XCJuYW1lIHx8IGxhYmVsXCIgW25nTW9kZWxdPVwibW9kZWxcIiAvPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlZmVyZW5jZVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZG9jdW1lbnQgb2YgbW9kZWw7IHRyYWNrQnk6IHRyYWNrQnlEb2N1bWVudFwiXG4gICAgICAgICAgICBjbGFzcz1cImZpbGUgZmlsZS11cGxvYWRlZFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxhIFtocmVmXT1cIm11bHRpVXBsb2FkU2VydmljZS5nZXREb3dubG9hZFVybCh1cmwsIGRvY3VtZW50KVwiPlxuICAgICAgICAgICAgICAgIHt7IGRvY3VtZW50LmZpbGVuYW1lIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTEgbXItMVwiPlxuICAgICAgICAgICAgICAgICh7eyB0b01lZ2FPY3RldHMoZG9jdW1lbnQuZmlsZVNpemUpIH19XG4gICAgICAgICAgICAgICAgPGFiYnIgdGl0bGU9XCJNZWdhb2N0ZXRcIj5NbzwvYWJicj5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhcmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGljb24tYnV0dG9uIGRlbGV0ZS11cGxvYWRlZFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbGUoZG9jdW1lbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Zm9laG4taWNvbi10aW1lc1xuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlN1cHByaW1lciB7eyBkb2N1bWVudC5maWxlbmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgPjwvZm9laG4taWNvbi10aW1lcz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c21hbGxcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtc2Vjb25kYXJ5IHVwbG9hZGVkLWdsb2JhbC1pbmZvXCJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0dsb2JhbEluZm9zKG1vZGVsKVwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cImdldEdsb2JhbEluZm9zKG1vZGVsKVwiXG4gICAgICAgID48L3NtYWxsPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyZWZlcmVuY2VcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHBlbmRpbmcgb2YgcGVuZGluZ0ZpbGVzOyB0cmFja0J5OiB0cmFja0J5UGVuZGluZ1wiXG4gICAgICAgICAgICBjbGFzcz1cImZpbGUgZmlsZS1wZW5kaW5nXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+e3sgcGVuZGluZy5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0xIG1yLTFcIj5cbiAgICAgICAgICAgICAgICAoe3sgdG9NZWdhT2N0ZXRzKHBlbmRpbmcuc2l6ZSkgfX1cbiAgICAgICAgICAgICAgICA8YWJiciB0aXRsZT1cIk1lZ2FvY3RldFwiPk1vPC9hYmJyPlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gaWNvbi1idXR0b24gZGVsZXRlLXBlbmRpbmdcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWxlKHBlbmRpbmcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Zm9laG4taWNvbi10aW1lc1xuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlN1cHByaW1lciB7eyBwZW5kaW5nLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgID48L2ZvZWhuLWljb24tdGltZXM+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LXNlY29uZGFyeSBwZW5kaW5nLWdsb2JhbC1pbmZvXCJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0dsb2JhbEluZm9zKHBlbmRpbmdGaWxlcylcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJnZXRHbG9iYWxJbmZvcyhwZW5kaW5nRmlsZXMpXCJcbiAgICAgICAgPjwvc21hbGw+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuQWRkTW9yZUZpbGVzKClcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbC1maWxlIGFjdHVhbC1pbnB1dFwiXG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICBbbmFtZV09XCJuYW1lIHx8IGxhYmVsXCJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICBbYXR0ci5hY2NlcHRdPVwiXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY2NlcHRlZEV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgPyBvdmVycmlkZUFjY2VwdGVkRXh0ZW5zaW9uc1xuICAgICAgICAgICAgICAgICAgICA6IHVwbG9hZGVySGVscGVyLmFjY2VwdFxuICAgICAgICAgICAgICAgICAgICA/IHVwbG9hZGVySGVscGVyLmFjY2VwdFxuICAgICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICNpbnB1dEZpbGVcbiAgICAgICAgLz5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NyLW9ubHknOiAhc2hvd1VwbG9hZEJ1dHRvbiB9XCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKSB8fCBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiYnVpbGRJZCgnRXJyb3JzQ29udGFpbmVyJylcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImlucHV0RmlsZS5jbGljaygpXCJcbiAgICAgICAgICAgICNlbnRyeUNvbXBvbmVudFxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBtdWx0aXBsZSA/IGNob29zZUJ1dHRvbkxhYmVsTXVsdGlwbGUgOiBjaG9vc2VCdXR0b25MYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImRyYWdBbmREcm9wXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImRyb3BmaWxlXCJcbiAgICAgICAgICAgIFtjbGFzcy5kcm9wZmlsZS1ib3JkZXItdHJhbnNwYXJlbnRdPVwic2hvd0Ryb3Bab25lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbnB1dEZpbGUuY2xpY2soKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IG11bHRpcGxlID8gZHJvcFpvbmVMYWJlbE11bHRpcGxlIDogZHJvcFpvbmVMYWJlbCB9fVxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
@@ -8,20 +8,20 @@ import { FormsModule } from '@angular/forms';
8
8
  import * as i0 from "@angular/core";
9
9
  export class FoehnMultiUploadModule {
10
10
  }
11
- FoehnMultiUploadModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiUploadModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
- FoehnMultiUploadModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiUploadModule, declarations: [FoehnMultiUploadComponent], imports: [CommonModule,
11
+ FoehnMultiUploadModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnMultiUploadModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ FoehnMultiUploadModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnMultiUploadModule, declarations: [FoehnMultiUploadComponent], imports: [CommonModule,
13
13
  FoehnIconsModule,
14
14
  FoehnValidationAlertsModule,
15
15
  SdkDictionaryModule,
16
16
  FormsModule], exports: [FoehnMultiUploadComponent] });
17
- FoehnMultiUploadModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiUploadModule, imports: [[
17
+ FoehnMultiUploadModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnMultiUploadModule, imports: [[
18
18
  CommonModule,
19
19
  FoehnIconsModule,
20
20
  FoehnValidationAlertsModule,
21
21
  SdkDictionaryModule,
22
22
  FormsModule
23
23
  ]] });
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiUploadModule, decorators: [{
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnMultiUploadModule, decorators: [{
25
25
  type: NgModule,
26
26
  args: [{
27
27
  imports: [
@@ -66,9 +66,9 @@ export class MultiUploadService {
66
66
  return `${baseUrl}/download/${this.reference}/doc/${document.reference}`;
67
67
  }
68
68
  }
69
- MultiUploadService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: MultiUploadService, deps: [{ token: i1.HttpClient }, { token: i2.GrowlBrokerService }, { token: i3.GesdemEventService }, { token: i4.GesdemHandlerService }, { token: i5.ApplicationInfoService }, { token: i6.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Injectable });
70
- MultiUploadService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: MultiUploadService, providedIn: 'root' });
71
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: MultiUploadService, decorators: [{
69
+ MultiUploadService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: MultiUploadService, deps: [{ token: i1.HttpClient }, { token: i2.GrowlBrokerService }, { token: i3.GesdemEventService }, { token: i4.GesdemHandlerService }, { token: i5.ApplicationInfoService }, { token: i6.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Injectable });
70
+ MultiUploadService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: MultiUploadService, providedIn: 'root' });
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: MultiUploadService, decorators: [{
72
72
  type: Injectable,
73
73
  args: [{
74
74
  providedIn: 'root'
@@ -147,9 +147,9 @@ export class PendingUploadService {
147
147
  }
148
148
  }
149
149
  }
150
- PendingUploadService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: PendingUploadService, deps: [{ token: i1.MultiUploadService }, { token: i2.GesdemHandlerService }, { token: i3.GesdemEventService }], target: i0.ɵɵFactoryTarget.Injectable });
151
- PendingUploadService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: PendingUploadService, providedIn: 'root' });
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: PendingUploadService, decorators: [{
150
+ PendingUploadService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: PendingUploadService, deps: [{ token: i1.MultiUploadService }, { token: i2.GesdemHandlerService }, { token: i3.GesdemEventService }], target: i0.ɵɵFactoryTarget.Injectable });
151
+ PendingUploadService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: PendingUploadService, providedIn: 'root' });
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: PendingUploadService, decorators: [{
153
153
  type: Injectable,
154
154
  args: [{
155
155
  providedIn: 'root'
@@ -0,0 +1,163 @@
1
+ import { Component, forwardRef, Input } from '@angular/core';
2
+ import { distinctUntilChanged, filter } from 'rxjs/operators';
3
+ import { FoehnInputComponent } from '../../foehn-input/foehn-input.component';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../foehn-growl/growl-broker.service";
6
+ import * as i2 from "../../foehn-upload/foehn-multi-upload/multi-upload.service";
7
+ import * as i3 from "../../sdk-dictionary/sdk-dictionary.service";
8
+ import * as i4 from "../../foehn-validation-alerts/foehn-validation-alerts.component";
9
+ import * as i5 from "ngx-image-cropper";
10
+ import * as i6 from "@angular/common";
11
+ import * as i7 from "@angular/forms";
12
+ import * as i8 from "../../sdk-dictionary/sdk-dictionary.pipe";
13
+ const blobToFile = (blobData, fileName) => {
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ const blob = blobData;
16
+ blob.name = fileName;
17
+ return blob;
18
+ };
19
+ const convertBase64UrlToFile = (croppedImageasBase64Url, filename) => {
20
+ const arr = croppedImageasBase64Url.split(',');
21
+ const mime = arr[0].match(/:(.*?);/)[1];
22
+ const bstr = atob(arr[1]);
23
+ let n = bstr.length;
24
+ const u8arr = new Uint8Array(n);
25
+ while (n--) {
26
+ u8arr[n] = bstr.charCodeAt(n);
27
+ }
28
+ if (!navigator.userAgent.includes('Edge')) {
29
+ // detect if not Edge
30
+ return new File([u8arr], filename, { type: mime });
31
+ }
32
+ else {
33
+ // Edge support the FileAPI but not the File constructor.
34
+ return blobToFile(new Blob([u8arr], { type: mime }), filename);
35
+ }
36
+ };
37
+ export class FoehnPictureUploadComponent extends FoehnInputComponent {
38
+ constructor(growlService, uploadService, dictionaryService) {
39
+ super();
40
+ this.growlService = growlService;
41
+ this.uploadService = uploadService;
42
+ this.dictionaryService = dictionaryService;
43
+ this.baseUrl = 'api/document';
44
+ this.croppedPictureFilename = 'photo.png';
45
+ this.resizeToWidth = 300;
46
+ this.resizeToHeight = 0;
47
+ this.shouldDisplayFileSavedConfirmation = true;
48
+ this.loading = false;
49
+ }
50
+ get hasPicture() {
51
+ return this.model && this.model.length && !!this.model[0].reference;
52
+ }
53
+ ngOnInit() {
54
+ super.ngOnInit();
55
+ this.currentLanguageSubscription = this.dictionaryService
56
+ .getCurrentLanguageCode()
57
+ .pipe(distinctUntilChanged())
58
+ .subscribe(language => {
59
+ this.currentLanguage = language;
60
+ });
61
+ }
62
+ onPictureSelection(imgEvent) {
63
+ this.refreshErrors([[], true]);
64
+ this.pictureToCrop = imgEvent;
65
+ this.loading = true;
66
+ }
67
+ onPictureSelectionFailed() {
68
+ const errors = [
69
+ {
70
+ name: this.name,
71
+ code: 'LoadingFailure',
72
+ message: this.dictionaryService.getKeySync('foehn-picture-upload.loading-failure-label')
73
+ }
74
+ ];
75
+ this.refreshErrors([errors, true]);
76
+ this.resetPictureSelection();
77
+ }
78
+ onImageCropped(croppedEvent) {
79
+ this.croppedPictureAsBase64Url = croppedEvent.base64;
80
+ }
81
+ resetPictureSelection() {
82
+ this.croppedPictureAsBase64Url = null;
83
+ this.pictureToCrop = null;
84
+ this.loading = false;
85
+ }
86
+ savePicture() {
87
+ this.markAsPristine();
88
+ const photo = convertBase64UrlToFile(this.croppedPictureAsBase64Url, this.croppedPictureFilename);
89
+ this.uploadService
90
+ .uploadDocuments(this.baseUrl, this.name, this.label, [photo], this.key, false, this.currentLanguage, this.shouldDisplayFileSavedConfirmation)
91
+ .pipe(filter(result => !!result))
92
+ .subscribe(({ documents, errors }) => {
93
+ this.resetPictureSelection();
94
+ if (!!documents.length) {
95
+ this.markAsDirty();
96
+ this.model = documents;
97
+ this.refreshErrors([[], true]);
98
+ }
99
+ else {
100
+ this.model = [];
101
+ this.refreshErrors([errors, true]);
102
+ }
103
+ });
104
+ }
105
+ deleteFile() {
106
+ this.uploadService
107
+ .deleteDocument(this.baseUrl, this.model[0])
108
+ .subscribe(() => {
109
+ this.model = [];
110
+ this.resetPictureSelection();
111
+ });
112
+ }
113
+ getDownloadUrl() {
114
+ return this.uploadService.getDownloadUrl(this.baseUrl, this.model[0]);
115
+ }
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ refreshErrors(results) {
118
+ const errors = results[0];
119
+ const isInSelectionMode = !this.hasPicture && !!this.croppedPictureAsBase64Url;
120
+ if (isInSelectionMode) {
121
+ const notNullError = errors.find(e => e.name === this.name && e.code === 'NotEmpty');
122
+ if (notNullError) {
123
+ notNullError.message = this.dictionaryService.getKeySync('foehn-picture-upload.selection-not-validated-label');
124
+ }
125
+ }
126
+ super.refreshErrors(results);
127
+ }
128
+ }
129
+ FoehnPictureUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnPictureUploadComponent, deps: [{ token: i1.GrowlBrokerService }, { token: i2.MultiUploadService }, { token: i3.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
130
+ FoehnPictureUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: FoehnPictureUploadComponent, selector: "foehn-picture-upload", inputs: { name: "name", key: "key", label: "label", baseUrl: "baseUrl", croppedPictureFilename: "croppedPictureFilename", resizeToWidth: "resizeToWidth", resizeToHeight: "resizeToHeight", shouldDisplayFileSavedConfirmation: "shouldDisplayFileSavedConfirmation" }, providers: [
131
+ {
132
+ provide: FoehnInputComponent,
133
+ useExisting: forwardRef(() => FoehnPictureUploadComponent),
134
+ multi: true
135
+ }
136
+ ], usesInheritance: true, ngImport: i0, template: "<div\n [attr.id]=\"buildId('Container')\"\n [class.has-danger]=\"hasErrors()\"\n [class.vd-form-group-danger]=\"hasErrors()\"\n class=\"form-group clearable-input-form-group\"\n tabindex=\"-1\"\n>\n <label\n [attr.for]=\"buildChildId()\"\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : labelStyleModifier\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <input type=\"hidden\" [name]=\"name || label\" [ngModel]=\"model\" />\n\n <ng-content></ng-content>\n\n <div *ngIf=\"hasPicture\" class=\"row\">\n <div class=\"col-md-6\">\n <img\n [id]=\"buildChildId('Picture')\"\n [attr.alt]=\"label\"\n [src]=\"getDownloadUrl()\"\n />\n </div>\n <div class=\"col-md-4\">\n <button\n type=\"button\"\n class=\"btn btn-danger w-100\"\n [attr.id]=\"buildChildId('DeleteButton')\"\n (click)=\"deleteFile()\"\n >\n {{\n 'foehn-picture-upload.delete-picture-label' | fromDictionary\n }}\n </button>\n </div>\n </div>\n\n <div *ngIf=\"!hasPicture && !croppedPictureAsBase64Url\">\n <input\n #inputFile\n type=\"file\"\n class=\"form-control-file d-none\"\n [attr.id]=\"name\"\n [attr.accept]=\"'.jpeg,.jpg,.png'\"\n [multiple]=\"false\"\n [name]=\"name\"\n (change)=\"onPictureSelection($event)\"\n />\n\n <button\n type=\"button\"\n class=\"btn btn-primary my-2\"\n [attr.id]=\"buildChildId('ChooseButton')\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n [attr.aria-describedby]=\"buildId('ErrorsContainer')\"\n (click)=\"inputFile.click()\"\n [disabled]=\"loading\"\n >\n {{ 'foehn-picture-upload.choose-button-label' | fromDictionary }}\n </button>\n </div>\n\n <div *ngIf=\"loading\">\n {{ 'foehn-picture-upload.loading-label' | fromDictionary }}\n </div>\n\n <div *ngIf=\"!hasPicture\" class=\"row\">\n <div class=\"col-md-6\">\n <image-cropper\n [id]=\"buildChildId('Cropper')\"\n (cropperReady)=\"loading = false\"\n (imageCropped)=\"onImageCropped($event)\"\n (loadImageFailed)=\"onPictureSelectionFailed()\"\n [aspectRatio]=\"3 / 4\"\n [imageChangedEvent]=\"pictureToCrop\"\n [maintainAspectRatio]=\"true\"\n [resizeToWidth]=\"resizeToWidth\"\n [resizeToHeight]=\"resizeToHeight\"\n [onlyScaleDown]=\"true\"\n format=\"png\"\n ></image-cropper>\n </div>\n\n <div *ngIf=\"!hasPicture\" class=\"col-md-4\">\n <div class=\"row mb-3\">\n <button\n *ngIf=\"croppedPictureAsBase64Url\"\n type=\"button\"\n class=\"btn btn-primary w-100\"\n [attr.id]=\"buildChildId('SaveButton')\"\n (click)=\"savePicture()\"\n >\n {{\n 'foehn-picture-upload.validate-selection-label'\n | fromDictionary\n }}\n </button>\n </div>\n <div class=\"row\">\n <button\n *ngIf=\"croppedPictureAsBase64Url\"\n type=\"button\"\n class=\"btn btn-secondary w-100\"\n [attr.id]=\"buildChildId('CancelButton')\"\n (click)=\"resetPictureSelection()\"\n >\n {{\n 'foehn-picture-upload.cancel-selection-label'\n | fromDictionary\n }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i4.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { type: i5.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "fromDictionary": i8.SdkDictionaryPipe } });
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnPictureUploadComponent, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'foehn-picture-upload', providers: [
140
+ {
141
+ provide: FoehnInputComponent,
142
+ useExisting: forwardRef(() => FoehnPictureUploadComponent),
143
+ multi: true
144
+ }
145
+ ], template: "<div\n [attr.id]=\"buildId('Container')\"\n [class.has-danger]=\"hasErrors()\"\n [class.vd-form-group-danger]=\"hasErrors()\"\n class=\"form-group clearable-input-form-group\"\n tabindex=\"-1\"\n>\n <label\n [attr.for]=\"buildChildId()\"\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : labelStyleModifier\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <input type=\"hidden\" [name]=\"name || label\" [ngModel]=\"model\" />\n\n <ng-content></ng-content>\n\n <div *ngIf=\"hasPicture\" class=\"row\">\n <div class=\"col-md-6\">\n <img\n [id]=\"buildChildId('Picture')\"\n [attr.alt]=\"label\"\n [src]=\"getDownloadUrl()\"\n />\n </div>\n <div class=\"col-md-4\">\n <button\n type=\"button\"\n class=\"btn btn-danger w-100\"\n [attr.id]=\"buildChildId('DeleteButton')\"\n (click)=\"deleteFile()\"\n >\n {{\n 'foehn-picture-upload.delete-picture-label' | fromDictionary\n }}\n </button>\n </div>\n </div>\n\n <div *ngIf=\"!hasPicture && !croppedPictureAsBase64Url\">\n <input\n #inputFile\n type=\"file\"\n class=\"form-control-file d-none\"\n [attr.id]=\"name\"\n [attr.accept]=\"'.jpeg,.jpg,.png'\"\n [multiple]=\"false\"\n [name]=\"name\"\n (change)=\"onPictureSelection($event)\"\n />\n\n <button\n type=\"button\"\n class=\"btn btn-primary my-2\"\n [attr.id]=\"buildChildId('ChooseButton')\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n [attr.aria-describedby]=\"buildId('ErrorsContainer')\"\n (click)=\"inputFile.click()\"\n [disabled]=\"loading\"\n >\n {{ 'foehn-picture-upload.choose-button-label' | fromDictionary }}\n </button>\n </div>\n\n <div *ngIf=\"loading\">\n {{ 'foehn-picture-upload.loading-label' | fromDictionary }}\n </div>\n\n <div *ngIf=\"!hasPicture\" class=\"row\">\n <div class=\"col-md-6\">\n <image-cropper\n [id]=\"buildChildId('Cropper')\"\n (cropperReady)=\"loading = false\"\n (imageCropped)=\"onImageCropped($event)\"\n (loadImageFailed)=\"onPictureSelectionFailed()\"\n [aspectRatio]=\"3 / 4\"\n [imageChangedEvent]=\"pictureToCrop\"\n [maintainAspectRatio]=\"true\"\n [resizeToWidth]=\"resizeToWidth\"\n [resizeToHeight]=\"resizeToHeight\"\n [onlyScaleDown]=\"true\"\n format=\"png\"\n ></image-cropper>\n </div>\n\n <div *ngIf=\"!hasPicture\" class=\"col-md-4\">\n <div class=\"row mb-3\">\n <button\n *ngIf=\"croppedPictureAsBase64Url\"\n type=\"button\"\n class=\"btn btn-primary w-100\"\n [attr.id]=\"buildChildId('SaveButton')\"\n (click)=\"savePicture()\"\n >\n {{\n 'foehn-picture-upload.validate-selection-label'\n | fromDictionary\n }}\n </button>\n </div>\n <div class=\"row\">\n <button\n *ngIf=\"croppedPictureAsBase64Url\"\n type=\"button\"\n class=\"btn btn-secondary w-100\"\n [attr.id]=\"buildChildId('CancelButton')\"\n (click)=\"resetPictureSelection()\"\n >\n {{\n 'foehn-picture-upload.cancel-selection-label'\n | fromDictionary\n }}\n </button>\n </div>\n </div>\n </div>\n</div>\n" }]
146
+ }], ctorParameters: function () { return [{ type: i1.GrowlBrokerService }, { type: i2.MultiUploadService }, { type: i3.SdkDictionaryService }]; }, propDecorators: { name: [{
147
+ type: Input
148
+ }], key: [{
149
+ type: Input
150
+ }], label: [{
151
+ type: Input
152
+ }], baseUrl: [{
153
+ type: Input
154
+ }], croppedPictureFilename: [{
155
+ type: Input
156
+ }], resizeToWidth: [{
157
+ type: Input
158
+ }], resizeToHeight: [{
159
+ type: Input
160
+ }], shouldDisplayFileSavedConfirmation: [{
161
+ type: Input
162
+ }] } });
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tcGljdHVyZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJlc3RhdGlvbnMtbmcvc3JjL2ZvZWhuLXVwbG9hZC9mb2Vobi1waWN0dXJlLXVwbG9hZC9mb2Vobi1waWN0dXJlLXVwbG9hZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tdXBsb2FkL2ZvZWhuLXBpY3R1cmUtdXBsb2FkL2ZvZWhuLXBpY3R1cmUtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7QUFROUUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFjLEVBQUUsUUFBZ0IsRUFBUSxFQUFFO0lBQzFELDhEQUE4RDtJQUM5RCxNQUFNLElBQUksR0FBUSxRQUFRLENBQUM7SUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFDckIsT0FBTyxJQUFZLENBQUM7QUFDeEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBRyxDQUMzQix1QkFBK0IsRUFDL0IsUUFBZ0IsRUFDWixFQUFFO0lBQ04sTUFBTSxHQUFHLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxD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bUI7WUFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztZQUMxRCxLQUFLLEVBQUUsSUFBSTtTQUNkO0tBQ0osaURDbERMLDArSUFzSUE7MkZEbEZhLDJCQUEyQjtrQkFYdkMsU0FBUzsrQkFDSSxzQkFBc0IsYUFFckI7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUM7NEJBQzFELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKOzZLQU1ELElBQUk7c0JBREgsS0FBSztnQkFJTixHQUFHO3NCQURGLEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixLQUFLO2dCQUlOLGNBQWM7c0JBRGIsS0FBSztnQkFJTixrQ0FBa0M7c0JBRGpDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRm9laG5JbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEb2N1bWVudFJlZmVyZW5jZSB9IGZyb20gJy4uLy4uL2ZvZWhuLXVwbG9hZC9kb2N1bWVudC1yZWZlcmVuY2UnO1xuaW1wb3J0IHsgR3Jvd2xCcm9rZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZm9laG4tZ3Jvd2wvZ3Jvd2wtYnJva2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTXVsdGlVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZm9laG4tdXBsb2FkL2ZvZWhuLW11bHRpLXVwbG9hZC9tdWx0aS11cGxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBTZGtEaWN0aW9uYXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3Nkay1kaWN0aW9uYXJ5L3Nkay1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUVycm9yIH0gZnJvbSAnLi4vLi4vZm9ybS1lcnJvcic7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCB9IGZyb20gJ25neC1pbWFnZS1jcm9wcGVyJztcblxuY29uc3QgYmxvYlRvRmlsZSA9IChibG9iRGF0YTogQmxvYiwgZmlsZU5hbWU6IHN0cmluZyk6IEZpbGUgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgYmxvYjogYW55ID0gYmxvYkRhdGE7XG4gICAgYmxvYi5uYW1lID0gZmlsZU5hbWU7XG4gICAgcmV0dXJuIGJsb2IgYXMgRmlsZTtcbn07XG5cbmNvbnN0IGNvbnZlcnRCYXNlNjRVcmxUb0ZpbGUgPSAoXG4gICAgY3JvcHBlZEltYWdlYXNCYXNlNjRVcmw6IHN0cmluZyxcbiAgICBmaWxlbmFtZTogc3RyaW5nXG4pOiBGaWxlID0+IHtcbiAgICBjb25zdCBhcnIgPSBjcm9wcGVkSW1hZ2Vhc0Jhc2U2NFVybC5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IG1pbWUgPSBhcnJbMF0ubWF0Y2goLzooLio/KTsvKVsxXTtcbiAgICBjb25zdCBic3RyID0gYXRvYihhcnJbMV0pO1xuICAgIGxldCBuID0gYnN0ci5sZW5ndGg7XG4gICAgY29uc3QgdThhcnIgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICB3aGlsZSAobi0tKSB7XG4gICAgICAgIHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xuICAgIH1cblxuICAgIGlmICghbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmNsdWRlcygnRWRnZScpKSB7XG4gICAgICAgIC8vIGRldGVjdCBpZiBub3QgRWRnZVxuICAgICAgICByZXR1cm4gbmV3IEZpbGUoW3U4YXJyXSwgZmlsZW5hbWUsIHsgdHlwZTogbWltZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFZGdlIHN1cHBvcnQgdGhlIEZpbGVBUEkgYnV0IG5vdCB0aGUgRmlsZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgcmV0dXJuIGJsb2JUb0ZpbGUobmV3IEJsb2IoW3U4YXJyXSwgeyB0eXBlOiBtaW1lIH0pLCBmaWxlbmFtZSk7XG4gICAgfVxufTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmb2Vobi1waWN0dXJlLXVwbG9hZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZvZWhuLXBpY3R1cmUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogRm9laG5JbnB1dENvbXBvbmVudCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZvZWhuUGljdHVyZVVwbG9hZENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb2VoblBpY3R1cmVVcGxvYWRDb21wb25lbnRcbiAgICBleHRlbmRzIEZvZWhuSW5wdXRDb21wb25lbnQ8RG9jdW1lbnRSZWZlcmVuY2VbXT5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KClcbiAgICBuYW1lOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIGtleTogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBsYWJlbDogc3RyaW5nO1xuXG4gICAgQElucHV0KClcbiAgICBiYXNlVXJsID0gJ2FwaS9kb2N1bWVudCc7XG5cbiAgICBASW5wdXQoKVxuICAgIGNyb3BwZWRQaWN0dXJlRmlsZW5hbWUgPSAncGhvdG8ucG5nJztcblxuICAgIEBJbnB1dCgpXG4gICAgcmVzaXplVG9XaWR0aCA9IDMwMDtcblxuICAgIEBJbnB1dCgpXG4gICAgcmVzaXplVG9IZWlnaHQgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBzaG91bGREaXNwbGF5RmlsZVNhdmVkQ29uZmlybWF0aW9uID0gdHJ1ZTtcblxuICAgIHBpY3R1cmVUb0Nyb3A6IEV2ZW50O1xuICAgIGNyb3BwZWRQaWN0dXJlQXNCYXNlNjRVcmw6IHN0cmluZztcbiAgICBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgY3VycmVudExhbmd1YWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIGN1cnJlbnRMYW5ndWFnZTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZ3Jvd2xTZXJ2aWNlOiBHcm93bEJyb2tlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdXBsb2FkU2VydmljZTogTXVsdGlVcGxvYWRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBTZGtEaWN0aW9uYXJ5U2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIGdldCBoYXNQaWN0dXJlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLmxlbmd0aCAmJiAhIXRoaXMubW9kZWxbMF0ucmVmZXJlbmNlO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZVN1YnNjcmlwdGlvbiA9IHRoaXMuZGljdGlvbmFyeVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRDdXJyZW50TGFuZ3VhZ2VDb2RlKClcbiAgICAgICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGxhbmd1YWdlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25QaWN0dXJlU2VsZWN0aW9uKGltZ0V2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZnJlc2hFcnJvcnMoW1tdLCB0cnVlXSk7XG4gICAgICAgIHRoaXMucGljdHVyZVRvQ3JvcCA9IGltZ0V2ZW50O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uUGljdHVyZVNlbGVjdGlvbkZhaWxlZCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTG9hZGluZ0ZhaWx1cmUnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0S2V5U3luYyhcbiAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLXBpY3R1cmUtdXBsb2FkLmxvYWRpbmctZmFpbHVyZS1sYWJlbCdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgICAgIHRoaXMucmVmcmVzaEVycm9ycyhbZXJyb3JzLCB0cnVlXSk7XG4gICAgICAgIHRoaXMucmVzZXRQaWN0dXJlU2VsZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUNyb3BwZWQoY3JvcHBlZEV2ZW50OiBJbWFnZUNyb3BwZWRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyb3BwZWRQaWN0dXJlQXNCYXNlNjRVcmwgPSBjcm9wcGVkRXZlbnQuYmFzZTY0O1xuICAgIH1cblxuICAgIHJlc2V0UGljdHVyZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcm9wcGVkUGljdHVyZUFzQmFzZTY0VXJsID0gbnVsbDtcbiAgICAgICAgdGhpcy5waWN0dXJlVG9Dcm9wID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgc2F2ZVBpY3R1cmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcblxuICAgICAgICBjb25zdCBwaG90byA9IGNvbnZlcnRCYXNlNjRVcmxUb0ZpbGUoXG4gICAgICAgICAgICB0aGlzLmNyb3BwZWRQaWN0dXJlQXNCYXNlNjRVcmwsXG4gICAgICAgICAgICB0aGlzLmNyb3BwZWRQaWN0dXJlRmlsZW5hbWVcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2VcbiAgICAgICAgICAgIC51cGxvYWREb2N1bWVudHMoXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlVXJsLFxuICAgICAgICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsLFxuICAgICAgICAgICAgICAgIFtwaG90b10sXG4gICAgICAgICAgICAgICAgdGhpcy5rZXksXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgdGhpcy5zaG91bGREaXNwbGF5RmlsZVNhdmVkQ29uZmlybWF0aW9uXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIocmVzdWx0ID0+ICEhcmVzdWx0KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgZG9jdW1lbnRzLCBlcnJvcnMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRQaWN0dXJlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEhZG9jdW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwgPSBkb2N1bWVudHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaEVycm9ycyhbW10sIHRydWVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaEVycm9ycyhbZXJyb3JzLCB0cnVlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVsZXRlRmlsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlXG4gICAgICAgICAgICAuZGVsZXRlRG9jdW1lbnQodGhpcy5iYXNlVXJsLCB0aGlzLm1vZGVsWzBdKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRQaWN0dXJlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREb3dubG9hZFVybCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRTZXJ2aWNlLmdldERvd25sb2FkVXJsKHRoaXMuYmFzZVVybCwgdGhpcy5tb2RlbFswXSk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZWZyZXNoRXJyb3JzKHJlc3VsdHM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVycm9yczogRm9ybUVycm9yW10gPSByZXN1bHRzWzBdO1xuXG4gICAgICAgIGNvbnN0IGlzSW5TZWxlY3Rpb25Nb2RlID1cbiAgICAgICAgICAgICF0aGlzLmhhc1BpY3R1cmUgJiYgISF0aGlzLmNyb3BwZWRQaWN0dXJlQXNCYXNlNjRVcmw7XG4gICAgICAgIGlmIChpc0luU2VsZWN0aW9uTW9kZSkge1xuICAgICAgICAgICAgY29uc3Qgbm90TnVsbEVycm9yID0gZXJyb3JzLmZpbmQoXG4gICAgICAgICAgICAgICAgZSA9PiBlLm5hbWUgPT09IHRoaXMubmFtZSAmJiBlLmNvZGUgPT09ICdOb3RFbXB0eSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobm90TnVsbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgbm90TnVsbEVycm9yLm1lc3NhZ2UgPSB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1waWN0dXJlLXVwbG9hZC5zZWxlY3Rpb24tbm90LXZhbGlkYXRlZC1sYWJlbCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIucmVmcmVzaEVycm9ycyhyZXN1bHRzKTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgW2F0dHIuaWRdPVwiYnVpbGRJZCgnQ29udGFpbmVyJylcIlxuICAgIFtjbGFzcy5oYXMtZGFuZ2VyXT1cImhhc0Vycm9ycygpXCJcbiAgICBbY2xhc3MudmQtZm9ybS1ncm91cC1kYW5nZXJdPVwiaGFzRXJyb3JzKClcIlxuICAgIGNsYXNzPVwiZm9ybS1ncm91cCBjbGVhcmFibGUtaW5wdXQtZm9ybS1ncm91cFwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4+XG4gICAgPGxhYmVsXG4gICAgICAgIFthdHRyLmZvcl09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgICpuZ0lmPVwiISFsYWJlbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlzTGFiZWxTck9ubHkgPyAnc3Itb25seScgOiBsYWJlbFN0eWxlTW9kaWZpZXJcIlxuICAgID5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXJlcXVpcmVkICYmICFoaWRlTm90UmVxdWlyZWRFeHRyYUxhYmVsXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICdmb2Vobi1pbnB1dC5vcHRpb25hbCcgfCBmcm9tRGljdGlvbmFyeSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cblxuICAgIDxmb2Vobi12YWxpZGF0aW9uLWFsZXJ0cyBbY29tcG9uZW50XT1cInRoaXNcIj48L2ZvZWhuLXZhbGlkYXRpb24tYWxlcnRzPlxuXG4gICAgPHNtYWxsXG4gICAgICAgICpuZ0lmPVwiaGVscFRleHRcIlxuICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKSArICdIZWxwJ1wiXG4gICAgICAgIGNsYXNzPVwiZm9ybS10ZXh0IHRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgW2lubmVySFRNTF09XCJoZWxwVGV4dFwiXG4gICAgPjwvc21hbGw+XG5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIFtuYW1lXT1cIm5hbWUgfHwgbGFiZWxcIiBbbmdNb2RlbF09XCJtb2RlbFwiIC8+XG5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiaGFzUGljdHVyZVwiIGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtpZF09XCJidWlsZENoaWxkSWQoJ1BpY3R1cmUnKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYWx0XT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImdldERvd25sb2FkVXJsKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgdy0xMDBcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgnRGVsZXRlQnV0dG9uJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVGaWxlKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1waWN0dXJlLXVwbG9hZC5kZWxldGUtcGljdHVyZS1sYWJlbCcgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWhhc1BpY3R1cmUgJiYgIWNyb3BwZWRQaWN0dXJlQXNCYXNlNjRVcmxcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjaW5wdXRGaWxlXG4gICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbC1maWxlIGQtbm9uZVwiXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJuYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmFjY2VwdF09XCInLmpwZWcsLmpwZywucG5nJ1wiXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uUGljdHVyZVNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgLz5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG15LTJcIlxuICAgICAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCdDaG9vc2VCdXR0b24nKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaGFzRXJyb3JzVG9EaXNwbGF5KCkgfHwgbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImJ1aWxkSWQoJ0Vycm9yc0NvbnRhaW5lcicpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJpbnB1dEZpbGUuY2xpY2soKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICdmb2Vobi1waWN0dXJlLXVwbG9hZC5jaG9vc2UtYnV0dG9uLWxhYmVsJyB8IGZyb21EaWN0aW9uYXJ5IH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAge3sgJ2ZvZWhuLXBpY3R1cmUtdXBsb2FkLmxvYWRpbmctbGFiZWwnIHwgZnJvbURpY3Rpb25hcnkgfX1cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaGFzUGljdHVyZVwiIGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICAgICAgPGltYWdlLWNyb3BwZXJcbiAgICAgICAgICAgICAgICBbaWRdPVwiYnVpbGRDaGlsZElkKCdDcm9wcGVyJylcIlxuICAgICAgICAgICAgICAgIChjcm9wcGVyUmVhZHkpPVwibG9hZGluZyA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cIm9uSW1hZ2VDcm9wcGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChsb2FkSW1hZ2VGYWlsZWQpPVwib25QaWN0dXJlU2VsZWN0aW9uRmFpbGVkKClcIlxuICAgICAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCIzIC8gNFwiXG4gICAgICAgICAgICAgICAgW2ltYWdlQ2hhbmdlZEV2ZW50XT1cInBpY3R1cmVUb0Nyb3BcIlxuICAgICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cInJlc2l6ZVRvV2lkdGhcIlxuICAgICAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJyZXNpemVUb0hlaWdodFwiXG4gICAgICAgICAgICAgICAgW29ubHlTY2FsZURvd25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgZm9ybWF0PVwicG5nXCJcbiAgICAgICAgICAgID48L2ltYWdlLWNyb3BwZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhaGFzUGljdHVyZVwiIGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjcm9wcGVkUGljdHVyZUFzQmFzZTY0VXJsXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHctMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCdTYXZlQnV0dG9uJylcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZVBpY3R1cmUoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLXBpY3R1cmUtdXBsb2FkLnZhbGlkYXRlLXNlbGVjdGlvbi1sYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3JvcHBlZFBpY3R1cmVBc0Jhc2U2NFVybFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHctMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCdDYW5jZWxCdXR0b24nKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldFBpY3R1cmVTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvZWhuLXBpY3R1cmUtdXBsb2FkLmNhbmNlbC1zZWxlY3Rpb24tbGFiZWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=