stream-chat-angular 5.13.0 → 6.0.0-beta.1

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 (165) hide show
  1. package/assets/i18n/en.d.ts +1 -0
  2. package/assets/version.d.ts +1 -1
  3. package/{esm2020 → esm2022}/assets/i18n/en.mjs +2 -1
  4. package/{esm2020 → esm2022}/assets/version.mjs +2 -2
  5. package/{esm2020 → esm2022}/lib/attachment-configuration.service.mjs +4 -4
  6. package/esm2022/lib/attachment-list/attachment-list.component.mjs +212 -0
  7. package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
  8. package/{esm2020 → esm2022}/lib/attachment.service.mjs +5 -5
  9. package/esm2022/lib/avatar/avatar.component.mjs +157 -0
  10. package/{esm2020 → esm2022}/lib/avatar-placeholder/avatar-placeholder.component.mjs +6 -6
  11. package/esm2022/lib/channel/channel.component.mjs +45 -0
  12. package/esm2022/lib/channel-header/channel-header.component.mjs +72 -0
  13. package/esm2022/lib/channel-list/channel-list.component.mjs +50 -0
  14. package/esm2022/lib/channel-preview/channel-preview.component.mjs +150 -0
  15. package/esm2022/lib/channel.service.mjs +1381 -0
  16. package/esm2022/lib/chat-client.service.mjs +227 -0
  17. package/{esm2020 → esm2022}/lib/custom-templates.service.mjs +5 -5
  18. package/{esm2020 → esm2022}/lib/date-parser.service.mjs +5 -5
  19. package/esm2022/lib/file-utils.mjs +35 -0
  20. package/{esm2020 → esm2022}/lib/get-channel-display-text.mjs +1 -1
  21. package/{esm2020 → esm2022}/lib/get-message-translation.mjs +1 -1
  22. package/{esm2020 → esm2022}/lib/icon/icon-placeholder/icon-placeholder.component.mjs +6 -6
  23. package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
  24. package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +11 -11
  25. package/{esm2020 → esm2022}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
  26. package/{esm2020 → esm2022}/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +6 -6
  27. package/{esm2020 → esm2022}/lib/list-users.mjs +1 -1
  28. package/esm2022/lib/message/message.component.mjs +486 -0
  29. package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +120 -0
  30. package/{esm2020 → esm2022}/lib/message-actions.service.mjs +5 -5
  31. package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
  32. package/{esm2020 → esm2022}/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +6 -6
  33. package/{esm2020 → esm2022}/lib/message-input/emoji-input.service.mjs +5 -5
  34. package/{esm2020 → esm2022}/lib/message-input/message-input-config.service.mjs +5 -5
  35. package/esm2022/lib/message-input/message-input.component.mjs +507 -0
  36. package/{esm2020 → esm2022}/lib/message-input/textarea/textarea.component.mjs +5 -5
  37. package/{esm2020 → esm2022}/lib/message-input/textarea.directive.mjs +5 -5
  38. package/{esm2020 → esm2022}/lib/message-input/voice-recorder.service.mjs +5 -5
  39. package/{esm2020 → esm2022}/lib/message-list/group-styles.mjs +1 -1
  40. package/esm2022/lib/message-list/message-list.component.mjs +715 -0
  41. package/{esm2020 → esm2022}/lib/message-preview.mjs +1 -1
  42. package/esm2022/lib/message-reactions/message-reactions.component.mjs +165 -0
  43. package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +57 -0
  44. package/{esm2020 → esm2022}/lib/message-reactions.service.mjs +5 -5
  45. package/{esm2020 → esm2022}/lib/message-text/message-text.component.mjs +6 -6
  46. package/esm2022/lib/message.service.mjs +43 -0
  47. package/{esm2020 → esm2022}/lib/modal/modal.component.mjs +6 -6
  48. package/{esm2020 → esm2022}/lib/notification/notification.component.mjs +6 -6
  49. package/esm2022/lib/notification-list/notification-list.component.mjs +33 -0
  50. package/{esm2020 → esm2022}/lib/notification.service.mjs +5 -5
  51. package/esm2022/lib/paginated-list/paginated-list.component.mjs +94 -0
  52. package/{esm2020 → esm2022}/lib/parse-date.mjs +1 -1
  53. package/{esm2020 → esm2022}/lib/read-by.mjs +1 -1
  54. package/esm2022/lib/stream-autocomplete-textarea.module.mjs +33 -0
  55. package/{esm2020 → esm2022}/lib/stream-avatar.module.mjs +5 -5
  56. package/{esm2020 → esm2022}/lib/stream-chat.module.mjs +59 -59
  57. package/{esm2020 → esm2022}/lib/stream-i18n.service.mjs +5 -5
  58. package/esm2022/lib/stream-textarea.module.mjs +31 -0
  59. package/{esm2020 → esm2022}/lib/theme.service.mjs +5 -5
  60. package/{esm2020 → esm2022}/lib/thread/thread.component.mjs +6 -6
  61. package/{esm2020 → esm2022}/lib/transliteration.service.mjs +5 -5
  62. package/esm2022/lib/types.mjs +2 -0
  63. package/{esm2020 → esm2022}/lib/user-list/user-list.component.mjs +5 -5
  64. package/esm2022/lib/virtualized-list.service.mjs +273 -0
  65. package/{esm2020 → esm2022}/lib/virtualized-message-list.service.mjs +1 -1
  66. package/{esm2020 → esm2022}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
  67. package/{esm2020 → esm2022}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
  68. package/{esm2020 → esm2022}/lib/voice-recorder/media-recorder.mjs +1 -1
  69. package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +61 -0
  70. package/esm2022/lib/voice-recorder/transcoder.service.mjs +121 -0
  71. package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +32 -0
  72. package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +80 -0
  73. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
  74. package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
  75. package/esm2022/lib/voice-recording/voice-recording.component.mjs +91 -0
  76. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.module.mjs +5 -5
  77. package/{esm2020 → esm2022}/lib/wave-form-sampler.mjs +1 -1
  78. package/esm2022/public-api.mjs +82 -0
  79. package/{fesm2020 → fesm2022}/stream-chat-angular.mjs +857 -1140
  80. package/fesm2022/stream-chat-angular.mjs.map +1 -0
  81. package/lib/attachment-list/attachment-list.component.d.ts +2 -5
  82. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +2 -2
  83. package/lib/attachment.service.d.ts +1 -1
  84. package/lib/avatar/avatar.component.d.ts +4 -4
  85. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  86. package/lib/channel-list/channel-list.component.d.ts +1 -0
  87. package/lib/channel-preview/channel-preview.component.d.ts +3 -4
  88. package/lib/channel.service.d.ts +40 -106
  89. package/lib/chat-client.service.d.ts +1 -4
  90. package/lib/custom-templates.service.d.ts +10 -10
  91. package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  92. package/lib/icon/icon.component.d.ts +2 -2
  93. package/lib/message/message.component.d.ts +2 -2
  94. package/lib/message-actions-box/message-actions-box.component.d.ts +2 -3
  95. package/lib/message-actions.service.d.ts +1 -1
  96. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +2 -2
  97. package/lib/message-input/message-input.component.d.ts +2 -2
  98. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  99. package/lib/message-input/textarea.directive.d.ts +2 -2
  100. package/lib/message-list/group-styles.d.ts +1 -1
  101. package/lib/message-list/message-list.component.d.ts +2 -3
  102. package/lib/message-reactions/message-reactions.component.d.ts +2 -3
  103. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +1 -2
  104. package/lib/message-text/message-text.component.d.ts +2 -2
  105. package/lib/modal/modal.component.d.ts +1 -1
  106. package/lib/notification/notification.component.d.ts +1 -1
  107. package/lib/notification-list/notification-list.component.d.ts +0 -1
  108. package/lib/paginated-list/paginated-list.component.d.ts +5 -2
  109. package/lib/read-by.d.ts +1 -1
  110. package/lib/types.d.ts +98 -84
  111. package/lib/user-list/user-list.component.d.ts +1 -1
  112. package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
  113. package/lib/voice-recorder/media-recorder.d.ts +2 -2
  114. package/lib/voice-recorder/transcoder.service.d.ts +4 -4
  115. package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +0 -1
  116. package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
  117. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
  118. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  119. package/package.json +15 -21
  120. package/public-api.d.ts +0 -1
  121. package/src/assets/i18n/en.ts +1 -0
  122. package/src/assets/version.ts +1 -1
  123. package/esm2020/lib/attachment-list/attachment-list.component.mjs +0 -224
  124. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
  125. package/esm2020/lib/avatar/avatar.component.mjs +0 -160
  126. package/esm2020/lib/channel/channel.component.mjs +0 -45
  127. package/esm2020/lib/channel-header/channel-header.component.mjs +0 -72
  128. package/esm2020/lib/channel-list/channel-list.component.mjs +0 -47
  129. package/esm2020/lib/channel-preview/channel-preview.component.mjs +0 -155
  130. package/esm2020/lib/channel-query.mjs +0 -77
  131. package/esm2020/lib/channel.service.mjs +0 -1546
  132. package/esm2020/lib/chat-client.service.mjs +0 -238
  133. package/esm2020/lib/file-utils.mjs +0 -35
  134. package/esm2020/lib/message/message.component.mjs +0 -486
  135. package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +0 -123
  136. package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
  137. package/esm2020/lib/message-input/message-input.component.mjs +0 -507
  138. package/esm2020/lib/message-list/message-list.component.mjs +0 -717
  139. package/esm2020/lib/message-reactions/message-reactions.component.mjs +0 -168
  140. package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -61
  141. package/esm2020/lib/message.service.mjs +0 -43
  142. package/esm2020/lib/notification-list/notification-list.component.mjs +0 -36
  143. package/esm2020/lib/paginated-list/paginated-list.component.mjs +0 -94
  144. package/esm2020/lib/stream-autocomplete-textarea.module.mjs +0 -33
  145. package/esm2020/lib/stream-textarea.module.mjs +0 -31
  146. package/esm2020/lib/types.mjs +0 -2
  147. package/esm2020/lib/virtualized-list.service.mjs +0 -271
  148. package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +0 -61
  149. package/esm2020/lib/voice-recorder/transcoder.service.mjs +0 -121
  150. package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -35
  151. package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +0 -80
  152. package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
  153. package/esm2020/lib/voice-recording/voice-recording.component.mjs +0 -91
  154. package/esm2020/public-api.mjs +0 -83
  155. package/fesm2015/stream-chat-angular.mjs +0 -9152
  156. package/fesm2015/stream-chat-angular.mjs.map +0 -1
  157. package/fesm2020/stream-chat-angular.mjs.map +0 -1
  158. package/lib/channel-query.d.ts +0 -26
  159. /package/{esm2020 → esm2022}/lib/format-duration.mjs +0 -0
  160. /package/{esm2020 → esm2022}/lib/injection-tokens.mjs +0 -0
  161. /package/{esm2020 → esm2022}/lib/is-image-attachment.mjs +0 -0
  162. /package/{esm2020 → esm2022}/lib/is-on-separate-date.mjs +0 -0
  163. /package/{esm2020 → esm2022}/lib/is-safari.mjs +0 -0
  164. /package/{esm2020 → esm2022}/lib/message-input/textarea.interface.mjs +0 -0
  165. /package/{esm2020 → esm2022}/stream-chat-angular.mjs +0 -0
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWwsXG4gIENoYW5uZWxGaWx0ZXJzLFxuICBDaGFubmVsTWVtYmVyUmVzcG9uc2UsXG4gIENvbW1hbmRSZXNwb25zZSxcbiAgRXZlbnQsXG4gIEV4dGVuZGFibGVHZW5lcmljcyxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBMaXRlcmFsU3RyaW5nRm9yVW5pb24sXG4gIE1lc3NhZ2VSZXNwb25zZUJhc2UsXG4gIE11dGUsXG4gIFJlYWN0aW9uR3JvdXBSZXNwb25zZSxcbiAgUmVhY3Rpb25SZXNwb25zZSxcbiAgVXNlcixcbiAgVXNlclJlc3BvbnNlLFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBBdHRhY2htZW50U2VydmljZSB9IGZyb20gJy4vYXR0YWNobWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEljb24gfSBmcm9tICcuL2ljb24vaWNvbi5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBVbmtub3duVHlwZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgdHlwZSBDdXN0b21UcmlnZ2VyID0ge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgY29tcG9uZW50UHJvcHM6IFVua25vd25UeXBlO1xuICAgIGRhdGE6IFVua25vd25UeXBlO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IEV4dGVuZGFibGVHZW5lcmljcyAmIHtcbiAgYXR0YWNobWVudFR5cGU6IERlZmF1bHRBdHRhY2htZW50VHlwZTtcbiAgY2hhbm5lbFR5cGU6IERlZmF1bHRDaGFubmVsVHlwZTtcbiAgY29tbWFuZFR5cGU6IExpdGVyYWxTdHJpbmdGb3JVbmlvbjtcbiAgZXZlbnRUeXBlOiBVbmtub3duVHlwZTtcbiAgbWVzc2FnZVR5cGU6IERlZmF1bHRNZXNzYWdlVHlwZTtcbiAgcmVhY3Rpb25UeXBlOiBVbmtub3duVHlwZTtcbiAgdXNlclR5cGU6IERlZmF1bHRVc2VyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIERlZmF1bHRBdHRhY2htZW50VHlwZSA9IFVua25vd25UeXBlICYge1xuICBhc3NldF91cmw/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbWFnZXM/OiBBcnJheTxBdHRhY2htZW50PERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+PjtcbiAgbWltZV90eXBlPzogc3RyaW5nO1xuICBpc0N1c3RvbUF0dGFjaG1lbnQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdENoYW5uZWxUeXBlID0gVW5rbm93blR5cGUgJiB7XG4gIGltYWdlPzogc3RyaW5nO1xuICBtZW1iZXJfY291bnQ/OiBudW1iZXI7XG4gIHN1YnRpdGxlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdENvbW1hbmRUeXBlID0gTGl0ZXJhbFN0cmluZ0ZvclVuaW9uO1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0TWVzc2FnZVR5cGUgPSBVbmtub3duVHlwZSAmIHtcbiAgY3VzdG9tVHlwZT86ICdjaGFubmVsLmludHJvJyB8ICdtZXNzYWdlLmRhdGUnO1xuICBkYXRlPzogc3RyaW5nIHwgRGF0ZTtcbiAgZXJyb3JTdGF0dXNDb2RlPzogbnVtYmVyO1xuICBldmVudD86IEV2ZW50PERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xuICB1bnJlYWQ/OiBib29sZWFuO1xuICByZWFkQnk6IFVzZXJSZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdO1xuICB0cmFuc2xhdGlvbj86IHN0cmluZztcbiAgcXVvdGVkX21lc3NhZ2U/OiBNZXNzYWdlUmVzcG9uc2VCYXNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xufTtcblxuZXhwb3J0IHR5cGUgRGVmYXVsdFVzZXJUeXBlSW50ZXJuYWwgPSB7XG4gIGltYWdlPzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWZhdWx0VXNlclR5cGUgPSBVbmtub3duVHlwZSAmXG4gIERlZmF1bHRVc2VyVHlwZUludGVybmFsICYge1xuICAgIG11dGVzPzogQXJyYXk8TXV0ZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPj47XG4gIH07XG5cbmV4cG9ydCB0eXBlIFN0cmVhbU1lc3NhZ2U8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IEZvcm1hdE1lc3NhZ2VSZXNwb25zZTxUPjtcblxuZXhwb3J0IHR5cGUgQXR0YWNobWVudFVwbG9hZEVycm9yUmVhc29uID1cbiAgfCAnZmlsZS1zaXplJ1xuICB8ICdmaWxlLWV4dGVuc2lvbidcbiAgfCAndW5rbm93bic7XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRVcGxvYWQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgZmlsZTogRmlsZTtcbiAgc3RhdGU6ICdlcnJvcicgfCAnc3VjY2VzcycgfCAndXBsb2FkaW5nJztcbiAgZXJyb3JSZWFzb24/OiBBdHRhY2htZW50VXBsb2FkRXJyb3JSZWFzb247XG4gIGVycm9yRXh0cmFJbmZvPzogeyBwYXJhbTogc3RyaW5nIH1bXTtcbiAgdXJsPzogc3RyaW5nO1xuICB0eXBlOiAnaW1hZ2UnIHwgJ2ZpbGUnIHwgJ3ZpZGVvJyB8ICd2b2ljZVJlY29yZGluZyc7XG4gIHByZXZpZXdVcmk/OiBzdHJpbmcgfCBBcnJheUJ1ZmZlcjtcbiAgdGh1bWJfdXJsPzogc3RyaW5nO1xuICBleHRyYURhdGE/OiBQYXJ0aWFsPEF0dGFjaG1lbnQ8VD4+O1xuICBmcm9tQXR0YWNobWVudD86IEF0dGFjaG1lbnQ8VD47XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbUNvbnRleHQgPSB7XG4gIGl0ZW06IE1lbnRpb25BdXRjb21wbGV0ZUxpc3RJdGVtO1xufTtcblxuZXhwb3J0IHR5cGUgQ29tbWFuZEF1dG9jb21wbGV0ZUxpc3RJdGVtQ29udGV4dCA9IHtcbiAgaXRlbTogQ29tYW5kQXV0b2NvbXBsZXRlTGlzdEl0ZW07XG59O1xuXG5leHBvcnQgdHlwZSBNZW50aW9uQXV0Y29tcGxldGVMaXN0SXRlbSA9IChcbiAgfCBDaGFubmVsTWVtYmVyUmVzcG9uc2VcbiAgfCBVc2VyUmVzcG9uc2VcbikgJiB7XG4gIGF1dG9jb21wbGV0ZUxhYmVsOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDb21hbmRBdXRvY29tcGxldGVMaXN0SXRlbSA9IENvbW1hbmRSZXNwb25zZSAmIHtcbiAgYXV0b2NvbXBsZXRlTGFiZWw6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvblR5cGUgPSAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nO1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25QYXlsb2FkPFQgPSBvYmplY3Q+ID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlO1xuICB0ZXh0Pzogc3RyaW5nO1xuICB0cmFuc2xhdGVQYXJhbXM/OiBvYmplY3Q7XG4gIHRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VD47XG4gIHRlbXBsYXRlQ29udGV4dD86IFQ7XG4gIGRpc21pc3NGbjogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxQcmV2aWV3Q29udGV4dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0ge1xuICBjaGFubmVsOiBDaGFubmVsPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhbm5lbFByZXZpZXdJbmZvQ29udGV4dDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gQ2hhbm5lbFByZXZpZXdDb250ZXh0ICYge1xuICBsYXRlc3RNZXNzYWdlPzogU3RyZWFtTWVzc2FnZTxUPjtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBsYXRlc3QgbWVzc2FnZSwgb3Igc29tZSBtZXRhIGluZm9ybWF0aW9uIChmb3IgZXhhbXBsZTogXCJOb3RoaW5nIHlldFwiKVxuICAgKi9cbiAgbGF0ZXN0TWVzc2FnZVRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgY2hhbm5lbCwgb3IgdGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgbWVtYmVyc1xuICAgKi9cbiAgY2hhbm5lbERpc3BsYXlUaXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBtZXNzYWdlIChvbmx5IGF2YWlsYWJsZSBpZiB0aGUgbGFzdCBtZXNzYWdlIHdhcyBzZW50IGJ5IHRoZSBjdXJyZW50IHVzZXIpXG4gICAqL1xuICBsYXRlc3RNZXNzYWdlU3RhdHVzPzogJ2RlbGl2ZXJlZCcgfCAncmVhZCc7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBvZiB0aGUgbGFzdCBtZXNzYWdlIChmb3JtYXR0ZWQgdG8gYSB1c2VyLWZyaWVuZGx5IHN0cmluZylcbiAgICovXG4gIGxhdGVzdE1lc3NhZ2VUaW1lPzogc3RyaW5nO1xuICB1bnJlYWRDb3VudDogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTWVudGlvblRlbXBsYXRlQ29udGV4dCA9IHtcbiAgY29udGVudDogc3RyaW5nO1xuICB1c2VyOiBVc2VyUmVzcG9uc2U7XG59O1xuXG5leHBvcnQgdHlwZSBFbW9qaVBpY2tlckNvbnRleHQgPSB7XG4gIGVtb2ppSW5wdXQkOiBTdWJqZWN0PHN0cmluZz47XG59O1xuXG5leHBvcnQgdHlwZSBUeXBpbmdJbmRpY2F0b3JDb250ZXh0ID0ge1xuICB1c2Vyc1R5cGluZyQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W10+O1xufTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUNvbnRleHQgPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGVuYWJsZWRNZXNzYWdlQWN0aW9uczogc3RyaW5nW107XG4gIGlzTGFzdFNlbnRNZXNzYWdlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBtb2RlOiAndGhyZWFkJyB8ICdtYWluJztcbiAgaXNIaWdobGlnaHRlZDogYm9vbGVhbjtcbiAgY3VzdG9tQWN0aW9uczogQ3VzdG9tTWVzc2FnZUFjdGlvbkl0ZW1bXTtcbiAgc2Nyb2xsJD86IE9ic2VydmFibGU8dm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBDaGFubmVsQWN0aW9uc0NvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHsgY2hhbm5lbDogQ2hhbm5lbDxUPiB9O1xuXG5leHBvcnQgdHlwZSBDdXN0b21BdHRhY2htZW50TGlzdENvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50PFQ+W107XG4gIHBhcmVudE1lc3NhZ2VJZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRMaXN0Q29udGV4dCA9IEN1c3RvbUF0dGFjaG1lbnRMaXN0Q29udGV4dCAmIHtcbiAgaW1hZ2VNb2RhbFN0YXRlQ2hhbmdlSGFuZGxlcj86IChzdGF0ZTogJ29wZW5lZCcgfCAnY2xvc2VkJykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIEF2YXRhclR5cGUgPSAnY2hhbm5lbCcgfCAndXNlcic7XG5cbmV4cG9ydCB0eXBlIEF2YXRhckxvY2F0aW9uID1cbiAgfCAnY2hhbm5lbC1wcmV2aWV3J1xuICB8ICdjaGFubmVsLWhlYWRlcidcbiAgfCAnbWVzc2FnZS1zZW5kZXInXG4gIHwgJ21lc3NhZ2UtcmVhZGVyJ1xuICB8ICdxdW90ZWQtbWVzc2FnZS1zZW5kZXInXG4gIHwgJ2F1dG9jb21wbGV0ZS1pdGVtJ1xuICB8ICd0eXBpbmctaW5kaWNhdG9yJ1xuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyB3aWxsIGJlIHJlbmFtZWQgdG8gdXNlci1saXN0IGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2VcbiAgICovXG4gIHwgJ3JlYWN0aW9uJztcblxuZXhwb3J0IHR5cGUgQXZhdGFyQ29udGV4dCA9IHtcbiAgbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpbWFnZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0eXBlOiBBdmF0YXJUeXBlIHwgdW5kZWZpbmVkO1xuICBsb2NhdGlvbjogQXZhdGFyTG9jYXRpb24gfCB1bmRlZmluZWQ7XG4gIGNoYW5uZWw/OiBDaGFubmVsPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+O1xuICB1c2VyPzogVXNlcjxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbiAgaW5pdGlhbHNUeXBlPzogJ2ZpcnN0LWxldHRlci1vZi1maXJzdC13b3JkJyB8ICdmaXJzdC1sZXR0ZXItb2YtZWFjaC13b3JkJztcbiAgc2hvd09ubGluZUluZGljYXRvcj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBBdHRhY2htZW50UHJldmlld0xpc3RDb250ZXh0ID0ge1xuICBhdHRhY2htZW50VXBsb2FkcyQ6IE9ic2VydmFibGU8QXR0YWNobWVudFVwbG9hZFtdPiB8IHVuZGVmaW5lZDtcbiAgcmV0cnlVcGxvYWRIYW5kbGVyOiAoZjogRmlsZSkgPT4gdm9pZDtcbiAgZGVsZXRlVXBsb2FkSGFuZGxlcjogKHU6IEF0dGFjaG1lbnRVcGxvYWQpID0+IHZvaWQ7XG4gIHNlcnZpY2U6IEF0dGFjaG1lbnRTZXJ2aWNlO1xufTtcblxuZXhwb3J0IHR5cGUgSWNvbkNvbnRleHQgPSB7XG4gIGljb246IEljb24gfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQWN0aW9uc0JveENvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgaXNNaW5lOiBib29sZWFuO1xuICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+IHwgdW5kZWZpbmVkO1xuICBlbmFibGVkQWN0aW9uczogc3RyaW5nW107XG4gIG1lc3NhZ2VUZXh0SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xufTtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUFjdGlvbkhhbmRsZXJFeHRyYVBhcmFtcyA9IHtcbiAgaXNNaW5lOiBib29sZWFuO1xuICBtZXNzYWdlVGV4dEh0bWxFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQWN0aW9uSGFuZGxlcjxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gKFxuICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+LFxuICBwYXJhbXM6IE1lc3NhZ2VBY3Rpb25IYW5kbGVyRXh0cmFQYXJhbXNcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZUFjdGlvbkJveEl0ZW1Db250ZXh0PFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7XG4gIGFjdGlvbk5hbWU6IHN0cmluZztcbiAgYWN0aW9uTGFiZWxPclRyYW5zbGF0aW9uS2V5OiAoKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD4pID0+IHN0cmluZykgfCBzdHJpbmc7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD47XG4gIGFjdGlvbkhhbmRsZXJFeHRyYVBhcmFtczogTWVzc2FnZUFjdGlvbkhhbmRsZXJFeHRyYVBhcmFtcztcbiAgYWN0aW9uSGFuZGxlcjogTWVzc2FnZUFjdGlvbkhhbmRsZXI8VD47XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlUmVhY3Rpb25BY3Rpb25JdGVtPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7XG4gIGFjdGlvbk5hbWU6ICdyZWFjdCc7XG4gIGlzVmlzaWJsZTogKFxuICAgIGVuYWJsZWRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBpc01pbmU6IGJvb2xlYW4sXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPlxuICApID0+IGJvb2xlYW47XG59O1xuXG50eXBlIE1lc3NhZ2VBY3Rpb25JdGVtQmFzZTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0ge1xuICBhY3Rpb25MYWJlbE9yVHJhbnNsYXRpb25LZXk6ICgobWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPikgPT4gc3RyaW5nKSB8IHN0cmluZztcbiAgaXNWaXNpYmxlOiAoXG4gICAgZW5hYmxlZEFjdGlvbnM6IHN0cmluZ1tdLFxuICAgIGlzTWluZTogYm9vbGVhbixcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlPFQ+XG4gICkgPT4gYm9vbGVhbjtcbiAgYWN0aW9uSGFuZGxlcjogTWVzc2FnZUFjdGlvbkhhbmRsZXI7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQWN0aW9uSXRlbTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gTWVzc2FnZUFjdGlvbkl0ZW1CYXNlPFQ+ICYge1xuICBhY3Rpb25OYW1lOlxuICAgIHwgJ3F1b3RlJ1xuICAgIHwgJ3BpbidcbiAgICB8ICdmbGFnJ1xuICAgIHwgJ2VkaXQnXG4gICAgfCAnZGVsZXRlJ1xuICAgIHwgJ21hcmstdW5yZWFkJ1xuICAgIHwgJ3RocmVhZC1yZXBseSdcbiAgICB8ICdjb3B5LW1lc3NhZ2UtdGV4dCc7XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbTxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gTWVzc2FnZUFjdGlvbkl0ZW1CYXNlPFQ+ICYge1xuICBhY3Rpb25OYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlUmVhY3Rpb25zU2VsZWN0b3JDb250ZXh0ID0ge1xuICBtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgb3duUmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W107XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlUmVhY3Rpb25zQ29udGV4dCA9IHtcbiAgbWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgYG1lc3NhZ2VSZWFjdGlvbkdyb3Vwc2AgKi9cbiAgbWVzc2FnZVJlYWN0aW9uQ291bnRzOiB7IFtrZXkgaW4gTWVzc2FnZVJlYWN0aW9uVHlwZV0/OiBudW1iZXIgfTtcbiAgLyoqIEBkZXByZWNhdGVkIHlvdSBjYW4gZmV0Y2ggdGhlIHJlYWN0aW9ucyB1c2luZyBbYGNoYXRTZXJ2aWNlLmNoYXRDbGllbnQucXVlcnlSZWFjdGlvbnMoKWBdKC9jaGF0L2RvY3MvamF2YXNjcmlwdC9zZW5kX3JlYWN0aW9uLyZxPXF1ZXJ5UmVhY3Rpb25zI3F1ZXJ5LXJlYWN0aW9ucykgKi9cbiAgbGF0ZXN0UmVhY3Rpb25zOiBSZWFjdGlvblJlc3BvbnNlPERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3M+W107XG4gIG93blJlYWN0aW9uczogUmVhY3Rpb25SZXNwb25zZTxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPltdO1xuICBtZXNzYWdlUmVhY3Rpb25Hcm91cHM6IHtcbiAgICBba2V5IGluIE1lc3NhZ2VSZWFjdGlvblR5cGVdOiBSZWFjdGlvbkdyb3VwUmVzcG9uc2U7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBNb2RhbENvbnRleHQgPSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgaXNPcGVuQ2hhbmdlSGFuZGxlcjogKGlzT3BlbjogYm9vbGVhbikgPT4gdm9pZDtcbiAgY29udGVudDogVGVtcGxhdGVSZWY8dm9pZD47XG59O1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25Db250ZXh0ID0ge1xuICB0eXBlOiBOb3RpZmljYXRpb25UeXBlIHwgdW5kZWZpbmVkO1xuICBjb250ZW50OiBUZW1wbGF0ZVJlZjx2b2lkPiB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIFRocmVhZEhlYWRlckNvbnRleHQgPSB7XG4gIHBhcmVudE1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGNsb3NlVGhyZWFkSGFuZGxlcjogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VSZWFjdGlvblR5cGUgPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRDb25maWdyYXRpb24gPSB7XG4gIHVybDogc3RyaW5nO1xuICBoZWlnaHQ6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEltYWdlQXR0YWNobWVudENvbmZpZ3VyYXRpb24gPSBBdHRhY2htZW50Q29uZmlncmF0aW9uICYge1xuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyO1xuICBvcmlnaW5hbFdpZHRoOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBWaWRlb0F0dGFjaG1lbnRDb25maWd1cmF0aW9uID0gSW1hZ2VBdHRhY2htZW50Q29uZmlndXJhdGlvbiAmIHtcbiAgdGh1bWJVcmw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBEZWxpdmVyZWRTdGF0dXNDb250ZXh0ID0ge1xuICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlO1xufTtcblxuZXhwb3J0IHR5cGUgU2VuZGluZ1N0YXR1c0NvbnRleHQgPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U7XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21NZXRhZGF0YUNvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZTxUPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlYWRTdGF0dXNDb250ZXh0ID0ge1xuICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlO1xuICByZWFkQnlUZXh0OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDaGFubmVsSGVhZGVySW5mb0NvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHsgY2hhbm5lbDogQ2hhbm5lbDxUPiB9O1xuXG5leHBvcnQgdHlwZSBDdXN0b21BdHRhY2htZW50VXBsb2FkQ29udGV4dCA9IHtcbiAgaXNNdWx0aXBsZUZpbGVVcGxvYWRFbmFibGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICBhdHRhY2htZW50U2VydmljZTogQXR0YWNobWVudFNlcnZpY2U7XG59O1xuXG5leHBvcnQgdHlwZSBBdHRhY2htZW50Q29udGV4dCA9IHtcbiAgYXR0YWNobWVudDogQXR0YWNobWVudDxEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzPjtcbn07XG5cbmV4cG9ydCB0eXBlIFN5c3RlbU1lc3NhZ2VDb250ZXh0ID0gTWVzc2FnZUNvbnRleHQgJiB7XG4gIHBhcnNlZERhdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIERhdGVTZXBhcmF0b3JDb250ZXh0ID0ge1xuICBkYXRlOiBEYXRlO1xuICBwYXJzZWREYXRlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBVbnJlYWRNZXNzYWdlc0luZGljYXRvckNvbnRleHQgPSB7XG4gIHVucmVhZENvdW50OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBVbnJlYWRNZXNzYWdlc05vdGlmaWNhdGlvbkNvbnRleHQgPVxuICBVbnJlYWRNZXNzYWdlc0luZGljYXRvckNvbnRleHQgJiB7XG4gICAgb25KdW1wOiAoKSA9PiB2b2lkO1xuICAgIG9uRGlzbWlzczogKCkgPT4gdm9pZDtcbiAgfTtcblxuZXhwb3J0IHR5cGUgQ2hhbm5lbFF1ZXJ5U3RhdGUgPSB7XG4gIHN0YXRlOiAnaW4tcHJvZ3Jlc3MnIHwgJ3N1Y2Nlc3MnIHwgJ2Vycm9yJztcbiAgLy8gTm8gdHlwZSBkZWYgZnJvbSBzdHJlYW0tY2hhdFxuICBlcnJvcj86IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlSW5wdXQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgdGV4dDogc3RyaW5nO1xuICBhdHRhY2htZW50czogQXR0YWNobWVudDxUPltdO1xuICBtZW50aW9uZWRVc2VyczogVXNlclJlc3BvbnNlPFQ+W107XG4gIHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHF1b3RlZE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjdXN0b21EYXRhOiB1bmRlZmluZWQgfCBQYXJ0aWFsPFRbJ21lc3NhZ2VUeXBlJ10+O1xufTtcblxuZXhwb3J0IHR5cGUgT2Zmc2V0TmV4dFBhZ2VDb25maWd1cmF0aW9uID0ge1xuICB0eXBlOiAnb2Zmc2V0JztcbiAgb2Zmc2V0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBGaWx0ZXJ0TmV4dFBhZ2VDb25maWd1cmF0aW9uPFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7XG4gIHR5cGU6ICdmaWx0ZXInO1xuICBwYWdpbmF0aW9uRmlsdGVyOiBDaGFubmVsRmlsdGVyczxUPjtcbn07XG5cbmV4cG9ydCB0eXBlIE5leHRQYWdlQ29uZmlndXJhdGlvbiA9XG4gIHwgT2Zmc2V0TmV4dFBhZ2VDb25maWd1cmF0aW9uXG4gIHwgRmlsdGVydE5leHRQYWdlQ29uZmlndXJhdGlvblxuICB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVJlYWN0aW9uQ2xpY2tEZXRhaWxzID0ge1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbiAgcmVhY3Rpb25UeXBlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlQWN0aW9uc0NsaWNrRGV0YWlsczxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0gTWVzc2FnZUFjdGlvbnNCb3hDb250ZXh0PFQ+ICYgeyBjdXN0b21BY3Rpb25zOiBDdXN0b21NZXNzYWdlQWN0aW9uSXRlbVtdIH07XG5cbmV4cG9ydCB0eXBlIEdyb3VwU3R5bGVPcHRpb25zID0ge1xuICBub0dyb3VwQnlVc2VyPzogYm9vbGVhbjtcbiAgbGFzdFJlYWRNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIG5vR3JvdXBCeVJlYWRTdGF0ZT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBDaGFubmVsUXVlcnlUeXBlID0gJ2ZpcnN0LXBhZ2UnIHwgJ25leHQtcGFnZScgfCAncmVjb3Zlci1zdGF0ZSc7XG5cbmV4cG9ydCB0eXBlIENoYW5uZWxRdWVyeVJlc3VsdDxcbiAgVCBleHRlbmRzIERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3MgPSBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzXG4+ID0ge1xuICBjaGFubmVsczogQ2hhbm5lbDxUPltdO1xuICBoYXNNb3JlUGFnZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFZpcnR1YWxpemVkTGlzdFNjcm9sbFBvc2l0aW9uID0gJ3RvcCcgfCAnYm90dG9tJyB8ICdtaWRkbGUnO1xuXG5leHBvcnQgdHlwZSBWaXJ0dWFsaXplZExpc3RRdWVyeVN0YXRlID0ge1xuICBzdGF0ZTogJ2xvYWRpbmctdG9wJyB8ICdsb2FkaW5nLWJvdHRvbScgfCAnc3VjY2VzcycgfCAnZXJyb3InO1xuICBlcnJvcj86IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBWaXJ0dWFsaXplZExpc3RRdWVyeURpcmVjdGlvbiA9ICd0b3AnIHwgJ2JvdHRvbSc7XG5cbmV4cG9ydCB0eXBlIFZpcnR1YWxpemVkTGlzdFZlcnRpY2FsSXRlbVBvc2l0aW9uID0gJ3RvcCcgfCAnYm90dG9tJyB8ICdtaWRkbGUnO1xuXG5leHBvcnQgdHlwZSBBdWRpb1JlY29yZGluZyA9IE1lZGlhUmVjb3JkaW5nICYgeyB3YXZlZm9ybV9kYXRhOiBudW1iZXJbXSB9O1xuXG5leHBvcnQgdHlwZSBNZWRpYVJlY29yZGluZyA9IHtcbiAgcmVjb3JkaW5nOiBGaWxlO1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICBtaW1lX3R5cGU6IHN0cmluZztcbiAgYXNzZXRfdXJsOiBzdHJpbmcgfCBBcnJheUJ1ZmZlciB8IHVuZGVmaW5lZDtcbn07XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUF0dGFjaG1lbnRQcmV2aWV3TGlzdENvbnRleHQ8XG4gIFQgZXh0ZW5kcyBEZWZhdWx0U3RyZWFtQ2hhdEdlbmVyaWNzID0gRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljc1xuPiA9IHtcbiAgYXR0YWNobWVudFNlcnZpY2U6IEF0dGFjaG1lbnRTZXJ2aWNlPFQ+O1xufTtcblxuZXhwb3J0IHR5cGUgVGhyZWFkUmVwbHlCdXR0b25Db250ZXh0PFxuICBUIGV4dGVuZHMgRGVmYXVsdFN0cmVhbUNoYXRHZW5lcmljcyA9IERlZmF1bHRTdHJlYW1DaGF0R2VuZXJpY3Ncbj4gPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2U8VD47XG59O1xuXG5leHBvcnQgdHlwZSBDdXN0b21BdXRvY29tcGxldGVJdGVtQ29udGV4dCA9IHtcbiAgaXRlbTogQ3VzdG9tQXV0b2NvbXBsZXRlSXRlbTtcbn07XG5cbmV4cG9ydCB0eXBlIEN1c3RvbUF1dG9jb21wbGV0ZUl0ZW0gPSB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIHRoZSB0ZXh0IHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlIGlucHV0IG9uY2UgYSB1c2VyIHNlbGVjdHMgYW4gb3B0aW9uIChhcHBlbmRlZCBhZnRlciB0aGUgdHJpZ2dlciBjaGFyYWN0ZXIpXG4gICAqL1xuICBhdXRvY29tcGxldGVMYWJlbDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tQXV0b2NvbXBsZXRlID0ge1xuICAvKipcbiAgICogVGhlIGNoYXJhY3RlciB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgYXV0b2NvbXBsZXRlIChmb3IgZXhhbXBsZSAjKVxuICAgKlxuICAgKiBUaGUgU0RLIHN1cHBvcnRzIEAgYW5kIC8gYnkgZGVmYXVsdCwgc28geW91IGNhbid0IHVzZSB0aG9zZVxuICAgKi9cbiAgdHJpZ2dlckNoYXJhY3Rlcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIEhUTUwgdGVtcGxhdGUgdG8gZGlzcGxheSBhbiBpdGVtIGluIHRoZSBhdXRvY29tcGxldGUgbGlzdFxuICAgKi9cbiAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHsgaXRlbTogQ3VzdG9tQXV0b2NvbXBsZXRlSXRlbSB9PjtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgaWYgc3BhY2UgY2hhcmFjdGVycyBjYW4gYmUgcGFydCBvZiB0aGUgYGF1dG9jb21wbGV0ZUxhYmVsYFxuICAgKi9cbiAgYWxsb3dTcGFjZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIHRvIGNob29zZSBmcm9tXG4gICAqXG4gICAqIEluIGNhc2UgeW91IHdhbnQgdG8gdXNlIGR5bmFtaWMvc2VydmVyLXNpZGUgZmlsdGVyaW5nLCB1c2UgYHVwZGF0ZU9wdGlvbnNgIGluc3RlYWRcbiAgICovXG4gIG9wdGlvbnM6IEN1c3RvbUF1dG9jb21wbGV0ZUl0ZW1bXTtcbiAgLyoqXG4gICAqIElmIHlvdSB3YW50IHRvIGhhdmUgZHluYW1pYy9zZXJ2ZXItc2lkZSBmaWx0ZXJpbmcgcHJvdmlkZSBhICBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSB0aGUgYXV0b2NvbXBsZXRlIG9wdGlvbnMgc2hvdWxkIGJlIGZpbHRlcmVkXG4gICAqIEBwYXJhbSBzZWFyY2hUZXJtIHRoZSB0ZXh0IHRvIGZpbHRlciBieSAod2l0aG91dCB0aGUgdHJpZ2dlciBjaGFyYWN0ZXIpLCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB0byB0aGUgb3B0aW9ucywgeW91IHNob3VsZCB0YWtlIGNhcmUgb2YgZXJyb3IgaGFuZGxpbmdcbiAgICovXG4gIHVwZGF0ZU9wdGlvbnM/OiAoc2VhcmNoVGVybTogc3RyaW5nKSA9PiBQcm9taXNlPEN1c3RvbUF1dG9jb21wbGV0ZUl0ZW1bXT47XG59O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVGV4dENvbnRleHQgPSB7XG4gIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQgfCBNZXNzYWdlUmVzcG9uc2VCYXNlO1xuICBpc1F1b3RlZDogYm9vbGVhbjtcbiAgc2hvdWxkVHJhbnNsYXRlOiBib29sZWFuO1xufTtcbiJdfQ==
@@ -1,271 +0,0 @@
1
- import { BehaviorSubject, Subject, combineLatest, distinctUntilChanged, filter, merge, of, pairwise, switchMap, take, } from 'rxjs';
2
- /**
3
- * The `VirtualizedListService` removes items from a list that are not currently displayed. This is a high-level overview of how it works:
4
- * - Create a new instance for each list that needs virtualization
5
- * - Input: Provide a reactive stream that emits all items in the list
6
- * - Input: Provide a reactive stream that emit the current scroll position (top, middle or bottom)
7
- * - Input: maximum number of items that are allowed in the list (in practice the service can make the virtualized list half this number, you should take this into account when choosing the value)
8
- * - Output: The service will emit the current list of displayed items via the virtualized items reactive stream
9
- * - For simplicity, the service won't track the height of the items, nor it needs an exact scroll location -> this is how removing items work:
10
- * - If scroll location is bottom/top items around the current bottom/top item will be emitted in the virtualized items stream
11
- * - If scroll location is middle, the service won't remove items, if new items are received, those will be appended to the virtualized list (this means that in theory the list can grow very big if a lot of new items are received while the user is scrolled somewhere, this is a trade-off for the simplicity of no height tracking)
12
- * - Since there is no height tracking, you should make sure to provide a maximum number that is big enough to fill the biggest expected screen size twice
13
- * - If the user scrolls to the bottom/top and there are no more local items to show, the service will trigger a query to load more items
14
- * - Input: you should provide the page size to use, in order for the service to determine if loading is necessary
15
- *
16
- * The `VirtualizedMessageListService` provides an implementation for the message list component.
17
- */
18
- export class VirtualizedListService {
19
- constructor(allItems$, scrollPosition$, jumpToItem$, pageSize = 25, maxItemCount = pageSize * 4) {
20
- this.allItems$ = allItems$;
21
- this.scrollPosition$ = scrollPosition$;
22
- this.jumpToItem$ = jumpToItem$;
23
- this.pageSize = pageSize;
24
- this.maxItemCount = maxItemCount;
25
- this.queryStateSubject = new BehaviorSubject({
26
- state: 'success',
27
- });
28
- this.bufferOnTop = 0;
29
- this.bufferOnBottom = 0;
30
- this.loadFromBuffer$ = new Subject();
31
- this.virtualizedItemsSubject = new BehaviorSubject([]);
32
- this.subscriptions = [];
33
- this.virtualizedItems$ = this.virtualizedItemsSubject.asObservable();
34
- this.queryState$ = this.queryStateSubject.asObservable();
35
- this.subscriptions.push(this.virtualizedItems$.subscribe((virtaluzedItems) => {
36
- this.allItems$.pipe(take(1)).subscribe((allItems) => {
37
- if (virtaluzedItems.length === allItems.length) {
38
- this.bufferOnTop = 0;
39
- this.bufferOnBottom = 0;
40
- }
41
- else if (virtaluzedItems.length === 0) {
42
- this.bufferOnTop = allItems.length;
43
- this.bufferOnBottom = 0;
44
- }
45
- else {
46
- this.bufferOnTop = allItems.indexOf(virtaluzedItems[0]);
47
- this.bufferOnBottom =
48
- allItems.length -
49
- allItems.indexOf(virtaluzedItems[virtaluzedItems.length - 1]) -
50
- 1;
51
- }
52
- });
53
- }));
54
- this.subscriptions.push(merge(this.allItems$, this.loadFromBuffer$)
55
- .pipe(switchMap(() => {
56
- return combineLatest([
57
- this.allItems$.pipe(take(1)),
58
- this.scrollPosition$.pipe(take(1)),
59
- ]);
60
- }))
61
- .subscribe(([items, scrollPosition]) => {
62
- if (scrollPosition === 'middle') {
63
- return;
64
- }
65
- const currentItems = this.virtualizedItemsSubject.getValue();
66
- if (items.length <= this.maxItemCount) {
67
- this.virtualizedItemsSubject.next(items);
68
- }
69
- else {
70
- let startIndex = 0;
71
- let endIndex = undefined;
72
- const numberOfItemsToRemove = items.length - Math.round(this.maxItemCount / 2);
73
- const numberOfItemsAfterRemove = items.length - numberOfItemsToRemove;
74
- switch (scrollPosition) {
75
- case 'top':
76
- if (currentItems.length > 0) {
77
- const middleIndex = items.findIndex((i) => this.isEqual(i, currentItems[0]));
78
- if (middleIndex !== -1) {
79
- startIndex = Math.max(0, middleIndex - Math.ceil(numberOfItemsAfterRemove / 2));
80
- endIndex = startIndex + numberOfItemsAfterRemove;
81
- }
82
- }
83
- else {
84
- endIndex = numberOfItemsAfterRemove;
85
- }
86
- break;
87
- case 'bottom':
88
- if (currentItems.length > 0) {
89
- const middleIndex = items.findIndex((i) => this.isEqual(i, currentItems[currentItems.length - 1]));
90
- if (middleIndex !== -1) {
91
- endIndex = Math.min(items.length, middleIndex + Math.floor(numberOfItemsAfterRemove / 2) + 1);
92
- startIndex = endIndex - numberOfItemsAfterRemove;
93
- }
94
- }
95
- else {
96
- startIndex = items.length - numberOfItemsAfterRemove;
97
- }
98
- break;
99
- }
100
- const virtualizedItems = items.slice(startIndex, endIndex);
101
- this.virtualizedItemsSubject.next(virtualizedItems);
102
- }
103
- }));
104
- this.subscriptions.push(this.scrollPosition$
105
- .pipe(distinctUntilChanged())
106
- .subscribe((position) => {
107
- if (this.queryStateSubject.getValue().state === `loading-${position}`) {
108
- return;
109
- }
110
- if (position === 'top') {
111
- if (this.bufferOnTop < this.pageSize) {
112
- void this.loadMore(position);
113
- }
114
- else {
115
- this.loadMoreFromBuffer('top');
116
- }
117
- }
118
- else if (position === 'bottom') {
119
- if (this.bufferOnBottom < this.pageSize) {
120
- void this.loadMore(position);
121
- }
122
- else {
123
- this.loadMoreFromBuffer('bottom');
124
- }
125
- }
126
- }));
127
- this.subscriptions.push(this.allItems$
128
- .pipe(pairwise(), filter(() => {
129
- let scrollPosition;
130
- this.scrollPosition$
131
- .pipe(take(1))
132
- .subscribe((s) => (scrollPosition = s));
133
- return scrollPosition === 'middle';
134
- }))
135
- .subscribe(([prevItems, currentItems]) => {
136
- if (currentItems.length < this.maxItemCount ||
137
- this.virtualizedItems.length === 0) {
138
- this.virtualizedItemsSubject.next(currentItems);
139
- }
140
- else {
141
- const currentFirstItem = this.virtualizedItems[0];
142
- const currentLastItem = this.virtualizedItems[this.virtualizedItems.length - 1];
143
- const prevStartIndex = prevItems.findIndex((i) => this.isEqual(i, currentFirstItem));
144
- const prevEndIndex = prevItems.findIndex((i) => this.isEqual(i, currentLastItem));
145
- const isStartRemainedSame = currentItems[prevStartIndex]
146
- ? this.isEqual(currentItems[prevStartIndex], currentFirstItem)
147
- : false;
148
- const isEndRemainedSame = currentItems[prevEndIndex]
149
- ? this.isEqual(currentItems[prevEndIndex], currentLastItem)
150
- : false;
151
- const hasNewItemsBottom = prevEndIndex === prevItems.length - 1 && isEndRemainedSame
152
- ? prevItems.length !== currentItems.length
153
- : false;
154
- if (isStartRemainedSame && isEndRemainedSame) {
155
- const endIndex = hasNewItemsBottom ? undefined : prevEndIndex + 1;
156
- this.virtualizedItemsSubject.next(currentItems.slice(prevStartIndex, endIndex));
157
- }
158
- let currentStartIndex = isStartRemainedSame ? prevStartIndex : -1;
159
- let currentEndIndex = isEndRemainedSame ? prevEndIndex : -1;
160
- if (!isStartRemainedSame) {
161
- currentStartIndex = currentItems.findIndex((i) => this.isEqual(i, currentFirstItem));
162
- }
163
- if (!isEndRemainedSame) {
164
- currentEndIndex = currentItems.findIndex((i) => this.isEqual(i, currentLastItem));
165
- }
166
- const hasNewItemsTop = prevStartIndex === 0 && !isStartRemainedSame
167
- ? currentStartIndex !== 0
168
- : false;
169
- if (currentStartIndex !== -1 && currentEndIndex !== -1) {
170
- const startIndex = hasNewItemsTop ? 0 : currentStartIndex;
171
- this.virtualizedItemsSubject.next(currentItems.slice(startIndex, currentEndIndex + 1));
172
- }
173
- else {
174
- if (currentStartIndex === -1 && currentEndIndex !== -1) {
175
- currentStartIndex = Math.max(0, currentEndIndex - (prevEndIndex - prevStartIndex));
176
- }
177
- if (currentEndIndex === -1 && currentStartIndex !== -1) {
178
- currentEndIndex = Math.min(currentItems.length - 1, currentStartIndex + (prevEndIndex - prevStartIndex));
179
- }
180
- this.virtualizedItemsSubject.next(currentItems.slice(currentStartIndex, currentEndIndex + 1));
181
- }
182
- }
183
- }));
184
- if (this.jumpToItem$) {
185
- this.subscriptions.push(this.jumpToItem$
186
- .pipe(switchMap((jumpToItem) => combineLatest([this.allItems$.pipe(take(1)), of(jumpToItem)])))
187
- .subscribe(([allItems, jumpToItem]) => {
188
- if (jumpToItem.item) {
189
- if (allItems.length < this.maxItemCount) {
190
- this.virtualizedItemsSubject.next(allItems);
191
- }
192
- else {
193
- const itemIndex = allItems.findIndex((i) =>
194
- // @ts-expect-error TODO: do we know a better typing here?
195
- this.isEqual(i, jumpToItem.item));
196
- if (itemIndex === -1) {
197
- return;
198
- }
199
- else {
200
- const position = jumpToItem.position || 'middle';
201
- const numberOfItemsToRemove = allItems.length - Math.round(this.maxItemCount / 2);
202
- const numberOfItemsAfterRemove = allItems.length - numberOfItemsToRemove;
203
- let startIndex = -1;
204
- let endIndex = -1;
205
- switch (position) {
206
- case 'top':
207
- startIndex = itemIndex;
208
- endIndex = Math.min(allItems.length, startIndex + numberOfItemsAfterRemove);
209
- break;
210
- case 'bottom':
211
- endIndex = itemIndex + 1;
212
- startIndex = Math.max(0, endIndex - numberOfItemsAfterRemove);
213
- break;
214
- case 'middle': {
215
- const itemsOnTop = itemIndex;
216
- const itemsOnBottom = allItems.length - itemIndex;
217
- if (itemsOnTop < Math.ceil(numberOfItemsAfterRemove / 2)) {
218
- startIndex = 0;
219
- }
220
- if (itemsOnBottom <
221
- Math.floor(numberOfItemsAfterRemove / 2) + 1) {
222
- endIndex = allItems.length;
223
- }
224
- if (startIndex === -1) {
225
- if (endIndex !== -1) {
226
- startIndex = endIndex - numberOfItemsAfterRemove;
227
- }
228
- else {
229
- startIndex =
230
- itemIndex - Math.ceil(numberOfItemsAfterRemove / 2);
231
- }
232
- }
233
- if (endIndex === -1) {
234
- endIndex = startIndex + numberOfItemsAfterRemove;
235
- }
236
- }
237
- }
238
- this.virtualizedItemsSubject.next(allItems.slice(startIndex, endIndex));
239
- }
240
- }
241
- }
242
- }));
243
- }
244
- }
245
- /**
246
- * The current value of virtualized items
247
- */
248
- get virtualizedItems() {
249
- return this.virtualizedItemsSubject.getValue();
250
- }
251
- /**
252
- * Remove all subscriptions, call this once you're done using an instance of this service
253
- */
254
- dispose() {
255
- this.subscriptions.forEach((s) => s.unsubscribe());
256
- }
257
- loadMoreFromBuffer(_) {
258
- this.loadFromBuffer$.next();
259
- }
260
- async loadMore(direction) {
261
- this.queryStateSubject.next({ state: `loading-${direction}` });
262
- try {
263
- await this.query(direction);
264
- this.queryStateSubject.next({ state: 'success' });
265
- }
266
- catch (e) {
267
- this.queryStateSubject.next({ state: 'error', error: e });
268
- }
269
- }
270
- }
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbGl6ZWQtbGlzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZpcnR1YWxpemVkLWxpc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixLQUFLLEVBQ0wsRUFBRSxFQUNGLFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxHQUNMLE1BQU0sTUFBTSxDQUFDO0FBUWQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxPQUFnQixzQkFBc0I7SUFrQjFDLFlBQ1UsU0FBMEIsRUFDMUIsZUFBMEQsRUFDbEQsV0FHZCxFQUNjLFdBQVcsRUFBRSxFQUNiLGVBQWUsUUFBUSxHQUFHLENBQUM7UUFQbkMsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQTJDO1FBQ2xELGdCQUFXLEdBQVgsV0FBVyxDQUd6QjtRQUNjLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDYixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWpCbkMsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQTRCO1lBQzNFLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUMsQ0FBQztRQUNPLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUN4Qyw0QkFBdUIsR0FBRyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQztRQUN2RCxrQkFBYSxHQUFtQixFQUFFLENBQUM7UUFZekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyRSxJQUFJLENBQUMsV0FBVyxH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Qyx1QkFBdUIsQ0FBQyxJQUFJLENBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUNyQyxDQUFDO3lCQUNIO3FCQUNGO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQ0wsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRVMsa0JBQWtCLENBQUMsQ0FBZ0M7UUFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUF3QztRQUM3RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUk7WUFDRixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7Q0FPRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBtZXJnZSxcbiAgb2YsXG4gIHBhaXJ3aXNlLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgVmlydHVhbGl6ZWRMaXN0UXVlcnlEaXJlY3Rpb24sXG4gIFZpcnR1YWxpemVkTGlzdFF1ZXJ5U3RhdGUsXG4gIFZpcnR1YWxpemVkTGlzdFNjcm9sbFBvc2l0aW9uLFxuICBWaXJ0dWFsaXplZExpc3RWZXJ0aWNhbEl0ZW1Qb3NpdGlvbixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBWaXJ0dWFsaXplZExpc3RTZXJ2aWNlYCByZW1vdmVzIGl0ZW1zIGZyb20gYSBsaXN0IHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgZGlzcGxheWVkLiBUaGlzIGlzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiBob3cgaXQgd29ya3M6XG4gKiAtIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmb3IgZWFjaCBsaXN0IHRoYXQgbmVlZHMgdmlydHVhbGl6YXRpb25cbiAqIC0gSW5wdXQ6IFByb3ZpZGUgYSByZWFjdGl2ZSBzdHJlYW0gdGhhdCBlbWl0cyBhbGwgaXRlbXMgaW4gdGhlIGxpc3RcbiAqIC0gSW5wdXQ6IFByb3ZpZGUgYSByZWFjdGl2ZSBzdHJlYW0gdGhhdCBlbWl0IHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAodG9wLCBtaWRkbGUgb3IgYm90dG9tKVxuICogLSBJbnB1dDogbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCAoaW4gcHJhY3RpY2UgdGhlIHNlcnZpY2UgY2FuIG1ha2UgdGhlIHZpcnR1YWxpemVkIGxpc3QgaGFsZiB0aGlzIG51bWJlciwgeW91IHNob3VsZCB0YWtlIHRoaXMgaW50byBhY2NvdW50IHdoZW4gY2hvb3NpbmcgdGhlIHZhbHVlKVxuICogLSBPdXRwdXQ6IFRoZSBzZXJ2aWNlIHdpbGwgZW1pdCB0aGUgY3VycmVudCBsaXN0IG9mIGRpc3BsYXllZCBpdGVtcyB2aWEgdGhlIHZpcnR1YWxpemVkIGl0ZW1zIHJlYWN0aXZlIHN0cmVhbVxuICogLSBGb3Igc2ltcGxpY2l0eSwgdGhlIHNlcnZpY2Ugd29uJ3QgdHJhY2sgdGhlIGhlaWdodCBvZiB0aGUgaXRlbXMsIG5vciBpdCBuZWVkcyBhbiBleGFjdCBzY3JvbGwgbG9jYXRpb24gLT4gdGhpcyBpcyBob3cgcmVtb3ZpbmcgaXRlbXMgd29yazpcbiAqICAgLSBJZiBzY3JvbGwgbG9jYXRpb24gaXMgYm90dG9tL3RvcCBpdGVtcyBhcm91bmQgdGhlIGN1cnJlbnQgYm90dG9tL3RvcCBpdGVtIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUgdmlydHVhbGl6ZWQgaXRlbXMgc3RyZWFtXG4gKiAgIC0gSWYgc2Nyb2xsIGxvY2F0aW9uIGlzIG1pZGRsZSwgdGhlIHNlcnZpY2Ugd29uJ3QgcmVtb3ZlIGl0ZW1zLCBpZiBuZXcgaXRlbXMgYXJlIHJlY2VpdmVkLCB0aG9zZSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSB2aXJ0dWFsaXplZCBsaXN0ICAodGhpcyBtZWFucyB0aGF0IGluIHRoZW9yeSB0aGUgbGlzdCBjYW4gZ3JvdyB2ZXJ5IGJpZyBpZiBhIGxvdCBvZiBuZXcgaXRlbXMgYXJlIHJlY2VpdmVkIHdoaWxlIHRoZSB1c2VyIGlzIHNjcm9sbGVkIHNvbWV3aGVyZSwgdGhpcyBpcyBhIHRyYWRlLW9mZiBmb3IgdGhlIHNpbXBsaWNpdHkgb2Ygbm8gaGVpZ2h0IHRyYWNraW5nKVxuICogICAtIFNpbmNlIHRoZXJlIGlzIG5vIGhlaWdodCB0cmFja2luZywgeW91IHNob3VsZCBtYWtlIHN1cmUgdG8gcHJvdmlkZSBhIG1heGltdW0gbnVtYmVyIHRoYXQgaXMgYmlnIGVub3VnaCB0byBmaWxsIHRoZSBiaWdnZXN0IGV4cGVjdGVkIHNjcmVlbiBzaXplIHR3aWNlXG4gKiAtIElmIHRoZSB1c2VyIHNjcm9sbHMgdG8gdGhlIGJvdHRvbS90b3AgYW5kIHRoZXJlIGFyZSBubyBtb3JlIGxvY2FsIGl0ZW1zIHRvIHNob3csIHRoZSBzZXJ2aWNlIHdpbGwgdHJpZ2dlciBhIHF1ZXJ5IHRvIGxvYWQgbW9yZSBpdGVtc1xuICogICAtIElucHV0OiB5b3Ugc2hvdWxkIHByb3ZpZGUgdGhlIHBhZ2Ugc2l6ZSB0byB1c2UsIGluIG9yZGVyIGZvciB0aGUgc2VydmljZSB0byBkZXRlcm1pbmUgaWYgbG9hZGluZyBpcyBuZWNlc3NhcnlcbiAqXG4gKiBUaGUgYFZpcnR1YWxpemVkTWVzc2FnZUxpc3RTZXJ2aWNlYCBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIG1lc3NhZ2UgbGlzdCBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaXJ0dWFsaXplZExpc3RTZXJ2aWNlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBpdGVtcyB0aGF0IHNob3VsZCBiZSBjdXJyZW50bHkgZGlzcGxheWVkLCBhIHN1YnNldCBvZiBhbGwgaXRlbXNcbiAgICovXG4gIHZpcnR1YWxpemVkSXRlbXMkOiBPYnNlcnZhYmxlPFRbXT47XG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHF1ZXJ5IHVzZWQgdG8gbG9hZCBtb3JlIGl0ZW1zXG4gICAqL1xuICBxdWVyeVN0YXRlJDogT2JzZXJ2YWJsZTxWaXJ0dWFsaXplZExpc3RRdWVyeVN0YXRlPjtcbiAgcHJvdGVjdGVkIHF1ZXJ5U3RhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWaXJ0dWFsaXplZExpc3RRdWVyeVN0YXRlPih7XG4gICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgfSk7XG4gIHByb3RlY3RlZCBidWZmZXJPblRvcCA9IDA7XG4gIHByb3RlY3RlZCBidWZmZXJPbkJvdHRvbSA9IDA7XG4gIHByb3RlY3RlZCBsb2FkRnJvbUJ1ZmZlciQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHZpcnR1YWxpemVkSXRlbXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUW10+KFtdKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWxsSXRlbXMkOiBPYnNlcnZhYmxlPFRbXT4sXG4gICAgcHJpdmF0ZSBzY3JvbGxQb3NpdGlvbiQ6IE9ic2VydmFibGU8VmlydHVhbGl6ZWRMaXN0U2Nyb2xsUG9zaXRpb24+LFxuICAgIHB1YmxpYyByZWFkb25seSBqdW1wVG9JdGVtJD86IE9ic2VydmFibGU8e1xuICAgICAgaXRlbTogUGFydGlhbDxUPiB8IHVuZGVmaW5lZDtcbiAgICAgIHBvc2l0aW9uPzogVmlydHVhbGl6ZWRMaXN0VmVydGljYWxJdGVtUG9zaXRpb247XG4gICAgfT4sXG4gICAgcHVibGljIHJlYWRvbmx5IHBhZ2VTaXplID0gMjUsXG4gICAgcHVibGljIHJlYWRvbmx5IG1heEl0ZW1Db3VudCA9IHBhZ2VTaXplICogNFxuICApIHtcbiAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXMkID0gdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnF1ZXJ5U3RhdGUkID0gdGhpcy5xdWVyeVN0YXRlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtcyQuc3Vic2NyaWJlKCh2aXJ0YWx1emVkSXRlbXMpID0+IHtcbiAgICAgICAgdGhpcy5hbGxJdGVtcyQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGFsbEl0ZW1zKSA9PiB7XG4gICAgICAgICAgaWYgKHZpcnRhbHV6ZWRJdGVtcy5sZW5ndGggPT09IGFsbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJPblRvcCA9IDA7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck9uQm90dG9tID0gMDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpcnRhbHV6ZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyT25Ub3AgPSBhbGxJdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlck9uQm90dG9tID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJPblRvcCA9IGFsbEl0ZW1zLmluZGV4T2YodmlydGFsdXplZEl0ZW1zWzBdKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyT25Cb3R0b20gPVxuICAgICAgICAgICAgICBhbGxJdGVtcy5sZW5ndGggLVxuICAgICAgICAgICAgICBhbGxJdGVtcy5pbmRleE9mKHZpcnRhbHV6ZWRJdGVtc1t2aXJ0YWx1emVkSXRlbXMubGVuZ3RoIC0gMV0pIC1cbiAgICAgICAgICAgICAgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgbWVyZ2UodGhpcy5hbGxJdGVtcyQsIHRoaXMubG9hZEZyb21CdWZmZXIkKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgICB0aGlzLmFsbEl0ZW1zJC5waXBlKHRha2UoMSkpLFxuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uJC5waXBlKHRha2UoMSkpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChbaXRlbXMsIHNjcm9sbFBvc2l0aW9uXSkgPT4ge1xuICAgICAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY3VycmVudEl0ZW1zID0gdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPD0gdGhpcy5tYXhJdGVtQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1N1YmplY3QubmV4dChpdGVtcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlck9mSXRlbXNUb1JlbW92ZSA9XG4gICAgICAgICAgICAgIGl0ZW1zLmxlbmd0aCAtIE1hdGgucm91bmQodGhpcy5tYXhJdGVtQ291bnQgLyAyKTtcbiAgICAgICAgICAgIGNvbnN0IG51bWJlck9mSXRlbXNBZnRlclJlbW92ZSA9XG4gICAgICAgICAgICAgIGl0ZW1zLmxlbmd0aCAtIG51bWJlck9mSXRlbXNUb1JlbW92ZTtcbiAgICAgICAgICAgIHN3aXRjaCAoc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gaXRlbXMuZmluZEluZGV4KChpKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzRXF1YWwoaSwgY3VycmVudEl0ZW1zWzBdKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlmIChtaWRkbGVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgbWlkZGxlSW5kZXggLSBNYXRoLmNlaWwobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMilcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtaWRkbGVJbmRleCA9IGl0ZW1zLmZpbmRJbmRleCgoaSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRJdGVtc1tjdXJyZW50SXRlbXMubGVuZ3RoIC0gMV0pXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKG1pZGRsZUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICBtaWRkbGVJbmRleCArIE1hdGguZmxvb3IobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMikgKyAxXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBlbmRJbmRleCAtIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGl0ZW1zLmxlbmd0aCAtIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2aXJ0dWFsaXplZEl0ZW1zID0gaXRlbXMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KHZpcnR1YWxpemVkSXRlbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiRcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcbiAgICAgICAgLnN1YnNjcmliZSgocG9zaXRpb24pID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnF1ZXJ5U3RhdGVTdWJqZWN0LmdldFZhbHVlKCkuc3RhdGUgPT09IGBsb2FkaW5nLSR7cG9zaXRpb259YFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zaXRpb24gPT09ICd0b3AnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXJPblRvcCA8IHRoaXMucGFnZVNpemUpIHtcbiAgICAgICAgICAgICAgdm9pZCB0aGlzLmxvYWRNb3JlKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZE1vcmVGcm9tQnVmZmVyKCd0b3AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09PSAnYm90dG9tJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyT25Cb3R0b20gPCB0aGlzLnBhZ2VTaXplKSB7XG4gICAgICAgICAgICAgIHZvaWQgdGhpcy5sb2FkTW9yZShwb3NpdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRNb3JlRnJvbUJ1ZmZlcignYm90dG9tJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmFsbEl0ZW1zJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBwYWlyd2lzZSgpLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsUG9zaXRpb24hOiBWaXJ0dWFsaXplZExpc3RTY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24kXG4gICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHMpID0+IChzY3JvbGxQb3NpdGlvbiA9IHMpKTtcbiAgICAgICAgICAgIHJldHVybiBzY3JvbGxQb3NpdGlvbiA9PT0gJ21pZGRsZSc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChbcHJldkl0ZW1zLCBjdXJyZW50SXRlbXNdKSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY3VycmVudEl0ZW1zLmxlbmd0aCA8IHRoaXMubWF4SXRlbUNvdW50IHx8XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQoY3VycmVudEl0ZW1zKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEZpcnN0SXRlbSA9IHRoaXMudmlydHVhbGl6ZWRJdGVtc1swXTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYXN0SXRlbSA9XG4gICAgICAgICAgICAgIHRoaXMudmlydHVhbGl6ZWRJdGVtc1t0aGlzLnZpcnR1YWxpemVkSXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBjb25zdCBwcmV2U3RhcnRJbmRleCA9IHByZXZJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50Rmlyc3RJdGVtKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZFbmRJbmRleCA9IHByZXZJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNFcXVhbChpLCBjdXJyZW50TGFzdEl0ZW0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBpc1N0YXJ0UmVtYWluZWRTYW1lID0gY3VycmVudEl0ZW1zW3ByZXZTdGFydEluZGV4XVxuICAgICAgICAgICAgICA/IHRoaXMuaXNFcXVhbChjdXJyZW50SXRlbXNbcHJldlN0YXJ0SW5kZXhdLCBjdXJyZW50Rmlyc3RJdGVtKVxuICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgaXNFbmRSZW1haW5lZFNhbWUgPSBjdXJyZW50SXRlbXNbcHJldkVuZEluZGV4XVxuICAgICAgICAgICAgICA/IHRoaXMuaXNFcXVhbChjdXJyZW50SXRlbXNbcHJldkVuZEluZGV4XSwgY3VycmVudExhc3RJdGVtKVxuICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNOZXdJdGVtc0JvdHRvbSA9XG4gICAgICAgICAgICAgIHByZXZFbmRJbmRleCA9PT0gcHJldkl0ZW1zLmxlbmd0aCAtIDEgJiYgaXNFbmRSZW1haW5lZFNhbWVcbiAgICAgICAgICAgICAgICA/IHByZXZJdGVtcy5sZW5ndGggIT09IGN1cnJlbnRJdGVtcy5sZW5ndGhcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoaXNTdGFydFJlbWFpbmVkU2FtZSAmJiBpc0VuZFJlbWFpbmVkU2FtZSkge1xuICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IGhhc05ld0l0ZW1zQm90dG9tID8gdW5kZWZpbmVkIDogcHJldkVuZEluZGV4ICsgMTtcbiAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgIGN1cnJlbnRJdGVtcy5zbGljZShwcmV2U3RhcnRJbmRleCwgZW5kSW5kZXgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50U3RhcnRJbmRleCA9IGlzU3RhcnRSZW1haW5lZFNhbWUgPyBwcmV2U3RhcnRJbmRleCA6IC0xO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRFbmRJbmRleCA9IGlzRW5kUmVtYWluZWRTYW1lID8gcHJldkVuZEluZGV4IDogLTE7XG5cbiAgICAgICAgICAgIGlmICghaXNTdGFydFJlbWFpbmVkU2FtZSkge1xuICAgICAgICAgICAgICBjdXJyZW50U3RhcnRJbmRleCA9IGN1cnJlbnRJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRGaXJzdEl0ZW0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRW5kUmVtYWluZWRTYW1lKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRFbmRJbmRleCA9IGN1cnJlbnRJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VxdWFsKGksIGN1cnJlbnRMYXN0SXRlbSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaGFzTmV3SXRlbXNUb3AgPVxuICAgICAgICAgICAgICBwcmV2U3RhcnRJbmRleCA9PT0gMCAmJiAhaXNTdGFydFJlbWFpbmVkU2FtZVxuICAgICAgICAgICAgICAgID8gY3VycmVudFN0YXJ0SW5kZXggIT09IDBcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFN0YXJ0SW5kZXggIT09IC0xICYmIGN1cnJlbnRFbmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGhhc05ld0l0ZW1zVG9wID8gMCA6IGN1cnJlbnRTdGFydEluZGV4O1xuICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgICAgY3VycmVudEl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGN1cnJlbnRFbmRJbmRleCArIDEpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXJ0SW5kZXggPT09IC0xICYmIGN1cnJlbnRFbmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U3RhcnRJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbmRJbmRleCAtIChwcmV2RW5kSW5kZXggLSBwcmV2U3RhcnRJbmRleClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbmRJbmRleCA9PT0gLTEgJiYgY3VycmVudFN0YXJ0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVuZEluZGV4ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICBjdXJyZW50SXRlbXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGFydEluZGV4ICsgKHByZXZFbmRJbmRleCAtIHByZXZTdGFydEluZGV4KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgICAgY3VycmVudEl0ZW1zLnNsaWNlKGN1cnJlbnRTdGFydEluZGV4LCBjdXJyZW50RW5kSW5kZXggKyAxKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICAgIGlmICh0aGlzLmp1bXBUb0l0ZW0kKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5qdW1wVG9JdGVtJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChqdW1wVG9JdGVtKSA9PlxuICAgICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmFsbEl0ZW1zJC5waXBlKHRha2UoMSkpLCBvZihqdW1wVG9JdGVtKV0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKFthbGxJdGVtcywganVtcFRvSXRlbV0pID0+IHtcbiAgICAgICAgICAgIGlmIChqdW1wVG9JdGVtLml0ZW0pIHtcbiAgICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA8IHRoaXMubWF4SXRlbUNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsaXplZEl0ZW1zU3ViamVjdC5uZXh0KGFsbEl0ZW1zKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBhbGxJdGVtcy5maW5kSW5kZXgoKGkpID0+XG4gICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRPRE86IGRvIHdlIGtub3cgYSBiZXR0ZXIgdHlwaW5nIGhlcmU/XG4gICAgICAgICAgICAgICAgICB0aGlzLmlzRXF1YWwoaSwganVtcFRvSXRlbS5pdGVtKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBqdW1wVG9JdGVtLnBvc2l0aW9uIHx8ICdtaWRkbGUnO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlID1cbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoIC0gTWF0aC5yb3VuZCh0aGlzLm1heEl0ZW1Db3VudCAvIDIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlID1cbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoIC0gbnVtYmVyT2ZJdGVtc1RvUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGl0ZW1JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBpdGVtSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCAtIG51bWJlck9mSXRlbXNBZnRlclJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pZGRsZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtc09uVG9wID0gaXRlbUluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zT25Cb3R0b20gPSBhbGxJdGVtcy5sZW5ndGggLSBpdGVtSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNPblRvcCA8IE1hdGguY2VpbChudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmUgLyAyKVxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zT25Cb3R0b20gPFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmUgLyAyKSArIDFcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4ID0gYWxsSXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gZW5kSW5kZXggLSBudW1iZXJPZkl0ZW1zQWZ0ZXJSZW1vdmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSW5kZXggLSBNYXRoLmNlaWwobnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlIC8gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgbnVtYmVyT2ZJdGVtc0FmdGVyUmVtb3ZlO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdmlydHVhbGl6ZWQgaXRlbXNcbiAgICovXG4gIGdldCB2aXJ0dWFsaXplZEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLnZpcnR1YWxpemVkSXRlbXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBzdWJzY3JpcHRpb25zLCBjYWxsIHRoaXMgb25jZSB5b3UncmUgZG9uZSB1c2luZyBhbiBpbnN0YW5jZSBvZiB0aGlzIHNlcnZpY2VcbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbG9hZE1vcmVGcm9tQnVmZmVyKF86IFZpcnR1YWxpemVkTGlzdFF1ZXJ5RGlyZWN0aW9uKSB7XG4gICAgdGhpcy5sb2FkRnJvbUJ1ZmZlciQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTW9yZShkaXJlY3Rpb246IFZpcnR1YWxpemVkTGlzdFF1ZXJ5RGlyZWN0aW9uKSB7XG4gICAgdGhpcy5xdWVyeVN0YXRlU3ViamVjdC5uZXh0KHsgc3RhdGU6IGBsb2FkaW5nLSR7ZGlyZWN0aW9ufWAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnkoZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMucXVlcnlTdGF0ZVN1YmplY3QubmV4dCh7IHN0YXRlOiAnc3VjY2VzcycgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5xdWVyeVN0YXRlU3ViamVjdC5uZXh0KHsgc3RhdGU6ICdlcnJvcicsIGVycm9yOiBlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBpc0VxdWFsOiAodDE6IFQsIHQyOiBUKSA9PiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBxdWVyeTogKFxuICAgIGRpcmVjdGlvbjogVmlydHVhbGl6ZWRMaXN0UXVlcnlEaXJlY3Rpb25cbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuIl19
@@ -1,61 +0,0 @@
1
- const ENCODING_BIT_RATE = 128; // kbps;
2
- const COUNT_SAMPLES_PER_ENCODED_BLOCK = 1152;
3
- const SAMPLE_RATE = 16000;
4
- const readFileAsArrayBuffer = (blob) => new Promise((resolve, reject) => {
5
- const blobReader = new FileReader();
6
- blobReader.onload = () => {
7
- resolve(blobReader.result);
8
- };
9
- blobReader.onerror = () => {
10
- reject(blobReader.error);
11
- };
12
- blobReader.readAsArrayBuffer(blob);
13
- });
14
- const toAudioBuffer = async (blob) => {
15
- const audioCtx = new AudioContext();
16
- const arrayBuffer = await readFileAsArrayBuffer(blob);
17
- const decodedData = await audioCtx.decodeAudioData(arrayBuffer);
18
- if (audioCtx.state !== 'closed')
19
- await audioCtx.close();
20
- return decodedData;
21
- };
22
- const renderAudio = async (audioBuffer, sampleRate) => {
23
- const offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
24
- const source = offlineAudioCtx.createBufferSource();
25
- source.buffer = audioBuffer;
26
- source.connect(offlineAudioCtx.destination);
27
- source.start();
28
- return await offlineAudioCtx.startRendering();
29
- };
30
- const float32ArrayToInt16Array = (float32Arr) => {
31
- const int16Arr = new Int16Array(float32Arr.length);
32
- for (let i = 0; i < float32Arr.length; i++) {
33
- const float32Value = float32Arr[i];
34
- // Clamp the float value between -1 and 1
35
- const clampedValue = Math.max(-1, Math.min(1, float32Value));
36
- // Convert the float value to a signed 16-bit integer
37
- int16Arr[i] = Math.round(clampedValue * 32767);
38
- }
39
- return int16Arr;
40
- };
41
- const splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i)).map(float32ArrayToInt16Array);
42
- /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */
43
- export async function encodeWebmToMp3(blob, lameJs) {
44
- const audioBuffer = await renderAudio(await toAudioBuffer(blob), SAMPLE_RATE);
45
- const channelCount = audioBuffer.numberOfChannels;
46
- const dataByChannel = splitDataByChannel(audioBuffer);
47
- const mp3Encoder = new lameJs.Mp3Encoder(channelCount, SAMPLE_RATE, ENCODING_BIT_RATE);
48
- const dataBuffer = [];
49
- let remaining = dataByChannel[0].length;
50
- for (let i = 0; remaining >= COUNT_SAMPLES_PER_ENCODED_BLOCK; i += COUNT_SAMPLES_PER_ENCODED_BLOCK) {
51
- const [leftChannelBlock, rightChannelBlock] = dataByChannel.map((channel) => channel.subarray(i, i + COUNT_SAMPLES_PER_ENCODED_BLOCK));
52
- dataBuffer.push(new Int8Array(mp3Encoder.encodeBuffer(leftChannelBlock, rightChannelBlock)));
53
- remaining -= COUNT_SAMPLES_PER_ENCODED_BLOCK;
54
- }
55
- const lastBlock = mp3Encoder.flush();
56
- if (lastBlock.length)
57
- dataBuffer.push(new Int8Array(lastBlock));
58
- return new Blob(dataBuffer, { type: 'audio/mp3;sbu_type=voice' });
59
- }
60
- /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-argument */
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXAzLXRyYW5zY29kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdHJlYW0tY2hhdC1hbmd1bGFyL3NyYy9saWIvdm9pY2UtcmVjb3JkZXIvbXAzLXRyYW5zY29kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRO0FBQ3ZDLE1BQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDO0FBQzdDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBVSxFQUF3QixFQUFFLENBQ2pFLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO0lBQzlCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDcEMsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDdkIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFxQixDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDO0lBRUYsVUFBVSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUM7SUFFRixVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQyxDQUFDLENBQUM7QUFFTCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsSUFBVSxFQUFFLEVBQUU7SUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxNQUFNLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEtBQUss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QztRQUNGLFVBQVUsQ0FBQyxJQUFJLENBQ2IsSUFBSSxTQUFTLENBQ1gsVUFBVSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUM3RCxDQUNGLENBQUM7UUFDRixTQUFTLElBQUksK0JBQStCLENBQUM7S0FDOUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckMsSUFBSSxTQUFTLENBQUMsTUFBTTtRQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELHFOQUFxTiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVOQ09ESU5HX0JJVF9SQVRFID0gMTI4OyAvLyBrYnBzO1xuY29uc3QgQ09VTlRfU0FNUExFU19QRVJfRU5DT0RFRF9CTE9DSyA9IDExNTI7XG5jb25zdCBTQU1QTEVfUkFURSA9IDE2MDAwO1xuXG5jb25zdCByZWFkRmlsZUFzQXJyYXlCdWZmZXIgPSAoYmxvYjogQmxvYik6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBibG9iUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBibG9iUmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHJlc29sdmUoYmxvYlJlYWRlci5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xuICAgIH07XG5cbiAgICBibG9iUmVhZGVyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoYmxvYlJlYWRlci5lcnJvcik7XG4gICAgfTtcblxuICAgIGJsb2JSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gIH0pO1xuXG5jb25zdCB0b0F1ZGlvQnVmZmVyID0gYXN5bmMgKGJsb2I6IEJsb2IpID0+IHtcbiAgY29uc3QgYXVkaW9DdHggPSBuZXcgQXVkaW9Db250ZXh0KCk7XG5cbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZWFkRmlsZUFzQXJyYXlCdWZmZXIoYmxvYik7XG4gIGNvbnN0IGRlY29kZWREYXRhID0gYXdhaXQgYXVkaW9DdHguZGVjb2RlQXVkaW9EYXRhKGFycmF5QnVmZmVyKTtcbiAgaWYgKGF1ZGlvQ3R4LnN0YXRlICE9PSAnY2xvc2VkJykgYXdhaXQgYXVkaW9DdHguY2xvc2UoKTtcbiAgcmV0dXJuIGRlY29kZWREYXRhO1xufTtcblxuY29uc3QgcmVuZGVyQXVkaW8gPSBhc3luYyAoYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyLCBzYW1wbGVSYXRlOiBudW1iZXIpID0+IHtcbiAgY29uc3Qgb2ZmbGluZUF1ZGlvQ3R4ID0gbmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoXG4gICAgYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyxcbiAgICBhdWRpb0J1ZmZlci5kdXJhdGlvbiAqIHNhbXBsZVJhdGUsXG4gICAgc2FtcGxlUmF0ZVxuICApO1xuICBjb25zdCBzb3VyY2UgPSBvZmZsaW5lQXVkaW9DdHguY3JlYXRlQnVmZmVyU291cmNlKCk7XG4gIHNvdXJjZS5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcbiAgc291cmNlLmNvbm5lY3Qob2ZmbGluZUF1ZGlvQ3R4LmRlc3RpbmF0aW9uKTtcbiAgc291cmNlLnN0YXJ0KCk7XG5cbiAgcmV0dXJuIGF3YWl0IG9mZmxpbmVBdWRpb0N0eC5zdGFydFJlbmRlcmluZygpO1xufTtcblxuY29uc3QgZmxvYXQzMkFycmF5VG9JbnQxNkFycmF5ID0gKGZsb2F0MzJBcnI6IEZsb2F0MzJBcnJheSkgPT4ge1xuICBjb25zdCBpbnQxNkFyciA9IG5ldyBJbnQxNkFycmF5KGZsb2F0MzJBcnIubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbG9hdDMyQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmxvYXQzMlZhbHVlID0gZmxvYXQzMkFycltpXTtcbiAgICAvLyBDbGFtcCB0aGUgZmxvYXQgdmFsdWUgYmV0d2VlbiAtMSBhbmQgMVxuICAgIGNvbnN0IGNsYW1wZWRWYWx1ZSA9IE1hdGgubWF4KC0xLCBNYXRoLm1pbigxLCBmbG9hdDMyVmFsdWUpKTtcbiAgICAvLyBDb252ZXJ0IHRoZSBmbG9hdCB2YWx1ZSB0byBhIHNpZ25lZCAxNi1iaXQgaW50ZWdlclxuICAgIGludDE2QXJyW2ldID0gTWF0aC5yb3VuZChjbGFtcGVkVmFsdWUgKiAzMjc2Nyk7XG4gIH1cbiAgcmV0dXJuIGludDE2QXJyO1xufTtcblxuY29uc3Qgc3BsaXREYXRhQnlDaGFubmVsID0gKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlcikgPT5cbiAgQXJyYXkuZnJvbSh7IGxlbmd0aDogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyB9LCAoXywgaSkgPT5cbiAgICBhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShpKVxuICApLm1hcChmbG9hdDMyQXJyYXlUb0ludDE2QXJyYXkpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VibVRvTXAzKGJsb2I6IEJsb2IsIGxhbWVKczogYW55KSB7XG4gIGNvbnN0IGF1ZGlvQnVmZmVyID0gYXdhaXQgcmVuZGVyQXVkaW8oYXdhaXQgdG9BdWRpb0J1ZmZlcihibG9iKSwgU0FNUExFX1JBVEUpO1xuICBjb25zdCBjaGFubmVsQ291bnQgPSBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzO1xuICBjb25zdCBkYXRhQnlDaGFubmVsID0gc3BsaXREYXRhQnlDaGFubmVsKGF1ZGlvQnVmZmVyKTtcbiAgY29uc3QgbXAzRW5jb2RlciA9IG5ldyBsYW1lSnMuTXAzRW5jb2RlcihcbiAgICBjaGFubmVsQ291bnQsXG4gICAgU0FNUExFX1JBVEUsXG4gICAgRU5DT0RJTkdfQklUX1JBVEVcbiAgKTtcblxuICBjb25zdCBkYXRhQnVmZmVyOiBJbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgcmVtYWluaW5nID0gZGF0YUJ5Q2hhbm5lbFswXS5sZW5ndGg7XG4gIGZvciAoXG4gICAgbGV0IGkgPSAwO1xuICAgIHJlbWFpbmluZyA+PSBDT1VOVF9TQU1QTEVTX1BFUl9FTkNPREVEX0JMT0NLO1xuICAgIGkgKz0gQ09VTlRfU0FNUExFU19QRVJfRU5DT0RFRF9CTE9DS1xuICApIHtcbiAgICBjb25zdCBbbGVmdENoYW5uZWxCbG9jaywgcmlnaHRDaGFubmVsQmxvY2tdID0gZGF0YUJ5Q2hhbm5lbC5tYXAoKGNoYW5uZWwpID0+XG4gICAgICBjaGFubmVsLnN1YmFycmF5KGksIGkgKyBDT1VOVF9TQU1QTEVTX1BFUl9FTkNPREVEX0JMT0NLKVxuICAgICk7XG4gICAgZGF0YUJ1ZmZlci5wdXNoKFxuICAgICAgbmV3IEludDhBcnJheShcbiAgICAgICAgbXAzRW5jb2Rlci5lbmNvZGVCdWZmZXIobGVmdENoYW5uZWxCbG9jaywgcmlnaHRDaGFubmVsQmxvY2spXG4gICAgICApXG4gICAgKTtcbiAgICByZW1haW5pbmcgLT0gQ09VTlRfU0FNUExFU19QRVJfRU5DT0RFRF9CTE9DSztcbiAgfVxuXG4gIGNvbnN0IGxhc3RCbG9jayA9IG1wM0VuY29kZXIuZmx1c2goKTtcbiAgaWYgKGxhc3RCbG9jay5sZW5ndGgpIGRhdGFCdWZmZXIucHVzaChuZXcgSW50OEFycmF5KGxhc3RCbG9jaykpO1xuICByZXR1cm4gbmV3IEJsb2IoZGF0YUJ1ZmZlciwgeyB0eXBlOiAnYXVkaW8vbXAzO3NidV90eXBlPXZvaWNlJyB9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCAqL1xuIl19
@@ -1,121 +0,0 @@
1
- import { Injectable, NgModule } from '@angular/core';
2
- import { readBlobAsArrayBuffer } from '../file-utils';
3
- import * as i0 from "@angular/core";
4
- const WAV_HEADER_LENGTH_BYTES = 44;
5
- const BYTES_PER_SAMPLE = 2;
6
- const RIFF_FILE_MAX_BYTES = 4294967295;
7
- const HEADER = {
8
- AUDIO_FORMAT: { offset: 20, value: 1 },
9
- BITS_PER_SAMPLE: { offset: 34, value: BYTES_PER_SAMPLE * 8 },
10
- BLOCK_ALIGN: { offset: 32 },
11
- BYTE_RATE: { offset: 28 },
12
- CHANNEL_COUNT: { offset: 22 },
13
- CHUNK_ID: { offset: 0, value: 0x52494646 },
14
- CHUNK_SIZE: { offset: 4 },
15
- FILE_FORMAT: { offset: 8, value: 0x57415645 },
16
- SAMPLE_RATE: { offset: 24 },
17
- SUBCHUNK1_ID: { offset: 12, value: 0x666d7420 },
18
- SUBCHUNK1_SIZE: { offset: 16, value: 16 },
19
- SUBCHUNK2_ID: { offset: 36, value: 0x64617461 },
20
- SUBCHUNK2_SIZE: { offset: 40 }, // actual audio data size
21
- };
22
- /**
23
- * The `TranscoderService` is used to transcibe audio recording to a format that's supported by all major browsers. The SDK uses this to create voice messages.
24
- *
25
- * If you want to use your own transcoder you can provide a `customTranscoder`.
26
- */
27
- export class TranscoderService {
28
- constructor() {
29
- this.config = {
30
- sampleRate: 16000,
31
- };
32
- this.splitDataByChannel = (audioBuffer) => Array.from({ length: audioBuffer.numberOfChannels }, (_, i) => audioBuffer.getChannelData(i));
33
- }
34
- /**
35
- * The default transcoder will leave audio/mp4 files as is, and transcode webm files to wav. If you want to customize this, you can provide your own transcoder using the `customTranscoder` field
36
- * @param blob
37
- * @returns the transcoded file
38
- */
39
- async transcode(blob) {
40
- if (this.customTranscoder) {
41
- return this.customTranscoder(blob);
42
- }
43
- if (blob.type.includes('audio/mp4')) {
44
- return blob;
45
- }
46
- const audioBuffer = await this.renderAudio(await this.toAudioBuffer(blob), this.config.sampleRate);
47
- const numberOfSamples = audioBuffer.duration * this.config.sampleRate;
48
- const fileSizeBytes = numberOfSamples * audioBuffer.numberOfChannels * BYTES_PER_SAMPLE +
49
- WAV_HEADER_LENGTH_BYTES;
50
- const arrayBuffer = new ArrayBuffer(fileSizeBytes);
51
- this.writeWavHeader({
52
- arrayBuffer,
53
- channelCount: audioBuffer.numberOfChannels,
54
- sampleRate: this.config.sampleRate,
55
- });
56
- this.writeWavAudioData({
57
- arrayBuffer,
58
- dataByChannel: this.splitDataByChannel(audioBuffer),
59
- });
60
- return new Blob([arrayBuffer], { type: 'audio/wav' });
61
- }
62
- async renderAudio(audioBuffer, sampleRate) {
63
- const offlineAudioCtx = new OfflineAudioContext(audioBuffer.numberOfChannels, audioBuffer.duration * sampleRate, sampleRate);
64
- const source = offlineAudioCtx.createBufferSource();
65
- source.buffer = audioBuffer;
66
- source.connect(offlineAudioCtx.destination);
67
- source.start();
68
- return await offlineAudioCtx.startRendering();
69
- }
70
- async toAudioBuffer(blob) {
71
- const audioCtx = new AudioContext();
72
- const arrayBuffer = await readBlobAsArrayBuffer(blob);
73
- const decodedData = await audioCtx.decodeAudioData(arrayBuffer);
74
- if (audioCtx.state !== 'closed')
75
- await audioCtx.close();
76
- return decodedData;
77
- }
78
- writeWavAudioData({ arrayBuffer, dataByChannel, }) {
79
- const dataView = new DataView(arrayBuffer);
80
- const channelCount = dataByChannel.length;
81
- dataByChannel.forEach((channelData, channelIndex) => {
82
- let writeOffset = WAV_HEADER_LENGTH_BYTES + channelCount * channelIndex;
83
- channelData.forEach((float32Value) => {
84
- dataView.setInt16(writeOffset, float32Value < 0
85
- ? Math.max(-1, float32Value) * 32768
86
- : Math.min(1, float32Value) * 32767, true);
87
- writeOffset += channelCount * BYTES_PER_SAMPLE;
88
- });
89
- });
90
- }
91
- writeWavHeader({ arrayBuffer, channelCount, sampleRate, }) {
92
- const byteRate = sampleRate * channelCount * BYTES_PER_SAMPLE; // bytes/sec
93
- const blockAlign = channelCount * BYTES_PER_SAMPLE;
94
- const dataView = new DataView(arrayBuffer);
95
- /*
96
- * The maximum size of a RIFF file is 4294967295 bytes and since the header takes up 44 bytes there are 4294967251 bytes left for the
97
- * data chunk.
98
- */
99
- const dataChunkSize = Math.min(dataView.byteLength - WAV_HEADER_LENGTH_BYTES, RIFF_FILE_MAX_BYTES - WAV_HEADER_LENGTH_BYTES);
100
- dataView.setUint32(HEADER.CHUNK_ID.offset, HEADER.CHUNK_ID.value); // "RIFF"
101
- dataView.setUint32(HEADER.CHUNK_SIZE.offset, arrayBuffer.byteLength - 8, true); // adjustment for the first two headers - chunk id + file size
102
- dataView.setUint32(HEADER.FILE_FORMAT.offset, HEADER.FILE_FORMAT.value); // "WAVE"
103
- dataView.setUint32(HEADER.SUBCHUNK1_ID.offset, HEADER.SUBCHUNK1_ID.value); // "fmt "
104
- dataView.setUint32(HEADER.SUBCHUNK1_SIZE.offset, HEADER.SUBCHUNK1_SIZE.value, true);
105
- dataView.setUint16(HEADER.AUDIO_FORMAT.offset, HEADER.AUDIO_FORMAT.value, true);
106
- dataView.setUint16(HEADER.CHANNEL_COUNT.offset, channelCount, true);
107
- dataView.setUint32(HEADER.SAMPLE_RATE.offset, sampleRate, true);
108
- dataView.setUint32(HEADER.BYTE_RATE.offset, byteRate, true);
109
- dataView.setUint16(HEADER.BLOCK_ALIGN.offset, blockAlign, true);
110
- dataView.setUint16(HEADER.BITS_PER_SAMPLE.offset, HEADER.BITS_PER_SAMPLE.value, true);
111
- dataView.setUint32(HEADER.SUBCHUNK2_ID.offset, HEADER.SUBCHUNK2_ID.value); // "data"
112
- dataView.setUint32(HEADER.SUBCHUNK2_SIZE.offset, dataChunkSize, true);
113
- }
114
- }
115
- TranscoderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TranscoderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
116
- TranscoderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TranscoderService, providedIn: NgModule });
117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TranscoderService, decorators: [{
118
- type: Injectable,
119
- args: [{ providedIn: NgModule }]
120
- }], ctorParameters: function () { return []; } });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNjb2Rlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL3ZvaWNlLXJlY29yZGVyL3RyYW5zY29kZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBVXRELE1BQU0sdUJBQXVCLEdBQUcsRUFBVyxDQUFDO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBVSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsVUFBbUIsQ0FBQztBQUVoRCxNQUFNLE1BQU0sR0FBRztJQUNiLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtJQUN0QyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7SUFDNUQsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtJQUMzQixTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0lBQ3pCLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDN0IsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0lBQzFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7SUFDekIsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO0lBQzdDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDM0IsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFB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QUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxTQUFTLENBQ2hCLE1BQU0sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUM3QixNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFDNUIsSUFBSSxDQUNMLENBQUM7UUFFRixRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3BGLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7OzhHQXhJVSxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQURKLFFBQVE7MkZBQ3JCLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcmVhZEJsb2JBc0FycmF5QnVmZmVyIH0gZnJvbSAnLi4vZmlsZS11dGlscyc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zY29kZXJDb25maWcgPSB7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRyYW5zY29kZVBhcmFtcyA9IFRyYW5zY29kZXJDb25maWcgJiB7XG4gIGJsb2I6IEJsb2I7XG59O1xuXG5jb25zdCBXQVZfSEVBREVSX0xFTkdUSF9CWVRFUyA9IDQ0IGFzIGNvbnN0O1xuY29uc3QgQllURVNfUEVSX1NBTVBMRSA9IDIgYXMgY29uc3Q7XG5jb25zdCBSSUZGX0ZJTEVfTUFYX0JZVEVTID0gNDI5NDk2NzI5NSBhcyBjb25zdDtcblxuY29uc3QgSEVBREVSID0ge1xuICBBVURJT19GT1JNQVQ6IHsgb2Zmc2V0OiAyMCwgdmFsdWU6IDEgfSwgLy8gUENNID0gMVxuICBCSVRTX1BFUl9TQU1QTEU6IHsgb2Zmc2V0OiAzNCwgdmFsdWU6IEJZVEVTX1BFUl9TQU1QTEUgKiA4IH0sIC8vIDE2IGJpdHMgZW5jb2RpbmdcbiAgQkxPQ0tfQUxJR046IHsgb2Zmc2V0OiAzMiB9LFxuICBCWVRFX1JBVEU6IHsgb2Zmc2V0OiAyOCB9LFxuICBDSEFOTkVMX0NPVU5UOiB7IG9mZnNldDogMjIgfSwgLy8gMSAtIG1vbm8sIDIgLSBzdGVyZW9cbiAgQ0hVTktfSUQ6IHsgb2Zmc2V0OiAwLCB2YWx1ZTogMHg1MjQ5NDY0NiB9LCAvLyBoZXggcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nIFwiUklGRlwiIChSZXNvdXJjZSBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdCkgLSBpZGVudGlmaWVzIHRoZSBmaWxlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgYSBjbGFzcyBvZiBtb3JlIHNwZWNpZmljIGZpbGUgZm9ybWF0cywgZS5nLiBXQVZFXG4gIENIVU5LX1NJWkU6IHsgb2Zmc2V0OiA0IH0sXG4gIEZJTEVfRk9STUFUOiB7IG9mZnNldDogOCwgdmFsdWU6IDB4NTc0MTU2NDUgfSwgLy8gaGV4IHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZyBcIldBVkVcIlxuICBTQU1QTEVfUkFURTogeyBvZmZzZXQ6IDI0IH0sXG4gIFNVQkNIVU5LMV9JRDogeyBvZmZzZXQ6IDEyLCB2YWx1ZTogMHg2NjZkNzQyMCB9LCAvLyBoZXggcmVwcmVzZW50YXRpb24gb2Ygc3RyaW5nIFwiZm10IFwiIC0gaWRlbnRpZmllcyB0aGUgc3RhcnQgb2YgXCJmb3JtYXRcIiBzZWN0aW9uIG9mIHRoZSBoZWFkZXJcbiAgU1VCQ0hVTksxX1NJWkU6IHsgb2Zmc2V0OiAxNiwgdmFsdWU6IDE2IH0sIC8vIFN1YmNodW5rMSBTaXplIHdpdGhvdXQgU1VCQ0hVTksxX0lEIGFuZCBTVUJDSFVOSzFfU0laRSBmaWVsZHNcbiAgU1VCQ0hVTksyX0lEOiB7IG9mZnNldDogMzYsIHZhbHVlOiAweDY0NjE3NDYxIH0sIC8vIGhleCByZXByZXNlbnRhdGlvbiBvZiBzdHJpbmcgXCJkYXRhXCIgLSBpZGVudGlmaWVzIHRoZSBzdGFydCBvZiBhY3R1YWwgYXVkaW8gZGF0YSBzZWN0aW9uXG4gIFNVQkNIVU5LMl9TSVpFOiB7IG9mZnNldDogNDAgfSwgLy8gYWN0dWFsIGF1ZGlvIGRhdGEgc2l6ZVxufSBhcyBjb25zdDtcblxudHlwZSBXcml0ZVdhdmVIZWFkZXJQYXJhbXMgPSB7XG4gIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgLy8gMSAtIG1vbm8sIDIgLSBzdGVyZW9cbiAgY2hhbm5lbENvdW50OiBudW1iZXI7XG4gIC8vIE51bWJlciBvZiBzYW1wbGVzIHBlciBzZWNvbmQsIGUuZy4gNDQxMDBIelxuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59O1xuXG50eXBlIFdyaXRlQXVkaW9EYXRhUGFyYW1zID0ge1xuICBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXI7XG4gIGRhdGFCeUNoYW5uZWw6IEZsb2F0MzJBcnJheVtdO1xufTtcblxuLyoqXG4gKiBUaGUgYFRyYW5zY29kZXJTZXJ2aWNlYCBpcyB1c2VkIHRvIHRyYW5zY2liZSBhdWRpbyByZWNvcmRpbmcgdG8gYSBmb3JtYXQgdGhhdCdzIHN1cHBvcnRlZCBieSBhbGwgbWFqb3IgYnJvd3NlcnMuIFRoZSBTREsgdXNlcyB0aGlzIHRvIGNyZWF0ZSB2b2ljZSBtZXNzYWdlcy5cbiAqXG4gKiBJZiB5b3Ugd2FudCB0byB1c2UgeW91ciBvd24gdHJhbnNjb2RlciB5b3UgY2FuIHByb3ZpZGUgYSBgY3VzdG9tVHJhbnNjb2RlcmAuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogTmdNb2R1bGUgfSlcbmV4cG9ydCBjbGFzcyBUcmFuc2NvZGVyU2VydmljZSB7XG4gIGNvbmZpZzogVHJhbnNjb2RlckNvbmZpZyA9IHtcbiAgICBzYW1wbGVSYXRlOiAxNjAwMCxcbiAgfTtcbiAgY3VzdG9tVHJhbnNjb2Rlcj86IChibG9iOiBCbG9iKSA9PiBCbG9iIHwgUHJvbWlzZTxCbG9iPjtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB0cmFuc2NvZGVyIHdpbGwgbGVhdmUgYXVkaW8vbXA0IGZpbGVzIGFzIGlzLCBhbmQgdHJhbnNjb2RlIHdlYm0gZmlsZXMgdG8gd2F2LiBJZiB5b3Ugd2FudCB0byBjdXN0b21pemUgdGhpcywgeW91IGNhbiBwcm92aWRlIHlvdXIgb3duIHRyYW5zY29kZXIgdXNpbmcgdGhlIGBjdXN0b21UcmFuc2NvZGVyYCBmaWVsZFxuICAgKiBAcGFyYW0gYmxvYlxuICAgKiBAcmV0dXJucyB0aGUgdHJhbnNjb2RlZCBmaWxlXG4gICAqL1xuICBhc3luYyB0cmFuc2NvZGUoYmxvYjogQmxvYikge1xuICAgIGlmICh0aGlzLmN1c3RvbVRyYW5zY29kZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbVRyYW5zY29kZXIoYmxvYik7XG4gICAgfVxuICAgIGlmIChibG9iLnR5cGUuaW5jbHVkZXMoJ2F1ZGlvL21wNCcpKSB7XG4gICAgICByZXR1cm4gYmxvYjtcbiAgICB9XG4gICAgY29uc3QgYXVkaW9CdWZmZXIgPSBhd2FpdCB0aGlzLnJlbmRlckF1ZGlvKFxuICAgICAgYXdhaXQgdGhpcy50b0F1ZGlvQnVmZmVyKGJsb2IpLFxuICAgICAgdGhpcy5jb25maWcuc2FtcGxlUmF0ZVxuICAgICk7XG4gICAgY29uc3QgbnVtYmVyT2ZTYW1wbGVzID0gYXVkaW9CdWZmZXIuZHVyYXRpb24gKiB0aGlzLmNvbmZpZy5zYW1wbGVSYXRlO1xuICAgIGNvbnN0IGZpbGVTaXplQnl0ZXMgPVxuICAgICAgbnVtYmVyT2ZTYW1wbGVzICogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyAqIEJZVEVTX1BFUl9TQU1QTEUgK1xuICAgICAgV0FWX0hFQURFUl9MRU5HVEhfQllURVM7XG5cbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihmaWxlU2l6ZUJ5dGVzKTtcbiAgICB0aGlzLndyaXRlV2F2SGVhZGVyKHtcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgY2hhbm5lbENvdW50OiBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5jb25maWcuc2FtcGxlUmF0ZSxcbiAgICB9KTtcbiAgICB0aGlzLndyaXRlV2F2QXVkaW9EYXRhKHtcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgZGF0YUJ5Q2hhbm5lbDogdGhpcy5zcGxpdERhdGFCeUNoYW5uZWwoYXVkaW9CdWZmZXIpLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgQmxvYihbYXJyYXlCdWZmZXJdLCB7IHR5cGU6ICdhdWRpby93YXYnIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlbmRlckF1ZGlvKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlciwgc2FtcGxlUmF0ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgb2ZmbGluZUF1ZGlvQ3R4ID0gbmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoXG4gICAgICBhdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzLFxuICAgICAgYXVkaW9CdWZmZXIuZHVyYXRpb24gKiBzYW1wbGVSYXRlLFxuICAgICAgc2FtcGxlUmF0ZVxuICAgICk7XG4gICAgY29uc3Qgc291cmNlID0gb2ZmbGluZUF1ZGlvQ3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuICAgIHNvdXJjZS5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcbiAgICBzb3VyY2UuY29ubmVjdChvZmZsaW5lQXVkaW9DdHguZGVzdGluYXRpb24pO1xuICAgIHNvdXJjZS5zdGFydCgpO1xuXG4gICAgcmV0dXJuIGF3YWl0IG9mZmxpbmVBdWRpb0N0eC5zdGFydFJlbmRlcmluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHRvQXVkaW9CdWZmZXIoYmxvYjogQmxvYikge1xuICAgIGNvbnN0IGF1ZGlvQ3R4ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuXG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYik7XG4gICAgY29uc3QgZGVjb2RlZERhdGEgPSBhd2FpdCBhdWRpb0N0eC5kZWNvZGVBdWRpb0RhdGEoYXJyYXlCdWZmZXIpO1xuICAgIGlmIChhdWRpb0N0eC5zdGF0ZSAhPT0gJ2Nsb3NlZCcpIGF3YWl0IGF1ZGlvQ3R4LmNsb3NlKCk7XG4gICAgcmV0dXJuIGRlY29kZWREYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdyaXRlV2F2QXVkaW9EYXRhKHtcbiAgICBhcnJheUJ1ZmZlcixcbiAgICBkYXRhQnlDaGFubmVsLFxuICB9OiBXcml0ZUF1ZGlvRGF0YVBhcmFtcykge1xuICAgIGNvbnN0IGRhdGFWaWV3ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSBkYXRhQnlDaGFubmVsLmxlbmd0aDtcblxuICAgIGRhdGFCeUNoYW5uZWwuZm9yRWFjaCgoY2hhbm5lbERhdGEsIGNoYW5uZWxJbmRleCkgPT4ge1xuICAgICAgbGV0IHdyaXRlT2Zmc2V0ID0gV0FWX0hFQURFUl9MRU5HVEhfQllURVMgKyBjaGFubmVsQ291bnQgKiBjaGFubmVsSW5kZXg7XG5cbiAgICAgIGNoYW5uZWxEYXRhLmZvckVhY2goKGZsb2F0MzJWYWx1ZSkgPT4ge1xuICAgICAgICBkYXRhVmlldy5zZXRJbnQxNihcbiAgICAgICAgICB3cml0ZU9mZnNldCxcbiAgICAgICAgICBmbG9hdDMyVmFsdWUgPCAwXG4gICAgICAgICAgICA/IE1hdGgubWF4KC0xLCBmbG9hdDMyVmFsdWUpICogMzI3NjhcbiAgICAgICAgICAgIDogTWF0aC5taW4oMSwgZmxvYXQzMlZhbHVlKSAqIDMyNzY3LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgICAgd3JpdGVPZmZzZXQgKz0gY2hhbm5lbENvdW50ICogQllURVNfUEVSX1NBTVBMRTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdyaXRlV2F2SGVhZGVyKHtcbiAgICBhcnJheUJ1ZmZlcixcbiAgICBjaGFubmVsQ291bnQsXG4gICAgc2FtcGxlUmF0ZSxcbiAgfTogV3JpdGVXYXZlSGVhZGVyUGFyYW1zKSB7XG4gICAgY29uc3QgYnl0ZVJhdGUgPSBzYW1wbGVSYXRlICogY2hhbm5lbENvdW50ICogQllURVNfUEVSX1NBTVBMRTsgLy8gYnl0ZXMvc2VjXG4gICAgY29uc3QgYmxvY2tBbGlnbiA9IGNoYW5uZWxDb3VudCAqIEJZVEVTX1BFUl9TQU1QTEU7XG5cbiAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyhhcnJheUJ1ZmZlcik7XG4gICAgLypcbiAgICAgKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgUklGRiBmaWxlIGlzIDQyOTQ5NjcyOTUgYnl0ZXMgYW5kIHNpbmNlIHRoZSBoZWFkZXIgdGFrZXMgdXAgNDQgYnl0ZXMgdGhlcmUgYXJlIDQyOTQ5NjcyNTEgYnl0ZXMgbGVmdCBmb3IgdGhlXG4gICAgICogZGF0YSBjaHVuay5cbiAgICAgKi9cbiAgICBjb25zdCBkYXRhQ2h1bmtTaXplID0gTWF0aC5taW4oXG4gICAgICBkYXRhVmlldy5ieXRlTGVuZ3RoIC0gV0FWX0hFQURFUl9MRU5HVEhfQllURVMsXG4gICAgICBSSUZGX0ZJTEVfTUFYX0JZVEVTIC0gV0FWX0hFQURFUl9MRU5HVEhfQllURVNcbiAgICApO1xuXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5DSFVOS19JRC5vZmZzZXQsIEhFQURFUi5DSFVOS19JRC52YWx1ZSk7IC8vIFwiUklGRlwiXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKFxuICAgICAgSEVBREVSLkNIVU5LX1NJWkUub2Zmc2V0LFxuICAgICAgYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAtIDgsXG4gICAgICB0cnVlXG4gICAgKTsgLy8gYWRqdXN0bWVudCBmb3IgdGhlIGZpcnN0IHR3byBoZWFkZXJzIC0gY2h1bmsgaWQgKyBmaWxlIHNpemVcbiAgICBkYXRhVmlldy5zZXRVaW50MzIoSEVBREVSLkZJTEVfRk9STUFULm9mZnNldCwgSEVBREVSLkZJTEVfRk9STUFULnZhbHVlKTsgLy8gXCJXQVZFXCJcblxuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuU1VCQ0hVTksxX0lELm9mZnNldCwgSEVBREVSLlNVQkNIVU5LMV9JRC52YWx1ZSk7IC8vIFwiZm10IFwiXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKFxuICAgICAgSEVBREVSLlNVQkNIVU5LMV9TSVpFLm9mZnNldCxcbiAgICAgIEhFQURFUi5TVUJDSFVOSzFfU0laRS52YWx1ZSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihcbiAgICAgIEhFQURFUi5BVURJT19GT1JNQVQub2Zmc2V0LFxuICAgICAgSEVBREVSLkFVRElPX0ZPUk1BVC52YWx1ZSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihIRUFERVIuQ0hBTk5FTF9DT1VOVC5vZmZzZXQsIGNoYW5uZWxDb3VudCwgdHJ1ZSk7XG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5TQU1QTEVfUkFURS5vZmZzZXQsIHNhbXBsZVJhdGUsIHRydWUpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuQllURV9SQVRFLm9mZnNldCwgYnl0ZVJhdGUsIHRydWUpO1xuICAgIGRhdGFWaWV3LnNldFVpbnQxNihIRUFERVIuQkxPQ0tfQUxJR04ub2Zmc2V0LCBibG9ja0FsaWduLCB0cnVlKTtcbiAgICBkYXRhVmlldy5zZXRVaW50MTYoXG4gICAgICBIRUFERVIuQklUU19QRVJfU0FNUExFLm9mZnNldCxcbiAgICAgIEhFQURFUi5CSVRTX1BFUl9TQU1QTEUudmFsdWUsXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIGRhdGFWaWV3LnNldFVpbnQzMihIRUFERVIuU1VCQ0hVTksyX0lELm9mZnNldCwgSEVBREVSLlNVQkNIVU5LMl9JRC52YWx1ZSk7IC8vIFwiZGF0YVwiXG4gICAgZGF0YVZpZXcuc2V0VWludDMyKEhFQURFUi5TVUJDSFVOSzJfU0laRS5vZmZzZXQsIGRhdGFDaHVua1NpemUsIHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNwbGl0RGF0YUJ5Q2hhbm5lbCA9IChhdWRpb0J1ZmZlcjogQXVkaW9CdWZmZXIpID0+XG4gICAgQXJyYXkuZnJvbSh7IGxlbmd0aDogYXVkaW9CdWZmZXIubnVtYmVyT2ZDaGFubmVscyB9LCAoXywgaSkgPT5cbiAgICAgIGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGkpXG4gICAgKTtcbn1cbiJdfQ==