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.
- package/assets/i18n/en.d.ts +1 -0
- package/assets/version.d.ts +1 -1
- package/{esm2020 → esm2022}/assets/i18n/en.mjs +2 -1
- package/{esm2020 → esm2022}/assets/version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/attachment-configuration.service.mjs +4 -4
- package/esm2022/lib/attachment-list/attachment-list.component.mjs +212 -0
- package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
- package/{esm2020 → esm2022}/lib/attachment.service.mjs +5 -5
- package/esm2022/lib/avatar/avatar.component.mjs +157 -0
- package/{esm2020 → esm2022}/lib/avatar-placeholder/avatar-placeholder.component.mjs +6 -6
- package/esm2022/lib/channel/channel.component.mjs +45 -0
- package/esm2022/lib/channel-header/channel-header.component.mjs +72 -0
- package/esm2022/lib/channel-list/channel-list.component.mjs +50 -0
- package/esm2022/lib/channel-preview/channel-preview.component.mjs +150 -0
- package/esm2022/lib/channel.service.mjs +1381 -0
- package/esm2022/lib/chat-client.service.mjs +227 -0
- package/{esm2020 → esm2022}/lib/custom-templates.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/date-parser.service.mjs +5 -5
- package/esm2022/lib/file-utils.mjs +35 -0
- package/{esm2020 → esm2022}/lib/get-channel-display-text.mjs +1 -1
- package/{esm2020 → esm2022}/lib/get-message-translation.mjs +1 -1
- package/{esm2020 → esm2022}/lib/icon/icon-placeholder/icon-placeholder.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +11 -11
- package/{esm2020 → esm2022}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/list-users.mjs +1 -1
- package/esm2022/lib/message/message.component.mjs +486 -0
- package/esm2022/lib/message-actions-box/message-actions-box.component.mjs +120 -0
- package/{esm2020 → esm2022}/lib/message-actions.service.mjs +5 -5
- package/esm2022/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +71 -0
- package/{esm2020 → esm2022}/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/message-input/emoji-input.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/message-input-config.service.mjs +5 -5
- package/esm2022/lib/message-input/message-input.component.mjs +507 -0
- package/{esm2020 → esm2022}/lib/message-input/textarea/textarea.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/textarea.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-input/voice-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-list/group-styles.mjs +1 -1
- package/esm2022/lib/message-list/message-list.component.mjs +715 -0
- package/{esm2020 → esm2022}/lib/message-preview.mjs +1 -1
- package/esm2022/lib/message-reactions/message-reactions.component.mjs +165 -0
- package/esm2022/lib/message-reactions-selector/message-reactions-selector.component.mjs +57 -0
- package/{esm2020 → esm2022}/lib/message-reactions.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/message-text/message-text.component.mjs +6 -6
- package/esm2022/lib/message.service.mjs +43 -0
- package/{esm2020 → esm2022}/lib/modal/modal.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/notification/notification.component.mjs +6 -6
- package/esm2022/lib/notification-list/notification-list.component.mjs +33 -0
- package/{esm2020 → esm2022}/lib/notification.service.mjs +5 -5
- package/esm2022/lib/paginated-list/paginated-list.component.mjs +94 -0
- package/{esm2020 → esm2022}/lib/parse-date.mjs +1 -1
- package/{esm2020 → esm2022}/lib/read-by.mjs +1 -1
- package/esm2022/lib/stream-autocomplete-textarea.module.mjs +33 -0
- package/{esm2020 → esm2022}/lib/stream-avatar.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/stream-chat.module.mjs +59 -59
- package/{esm2020 → esm2022}/lib/stream-i18n.service.mjs +5 -5
- package/esm2022/lib/stream-textarea.module.mjs +31 -0
- package/{esm2020 → esm2022}/lib/theme.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/thread/thread.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/transliteration.service.mjs +5 -5
- package/esm2022/lib/types.mjs +2 -0
- package/{esm2020 → esm2022}/lib/user-list/user-list.component.mjs +5 -5
- package/esm2022/lib/virtualized-list.service.mjs +273 -0
- package/{esm2020 → esm2022}/lib/virtualized-message-list.service.mjs +1 -1
- package/{esm2020 → esm2022}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/voice-recorder/media-recorder.mjs +1 -1
- package/esm2022/lib/voice-recorder/mp3-transcoder.mjs +61 -0
- package/esm2022/lib/voice-recorder/transcoder.service.mjs +121 -0
- package/esm2022/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +32 -0
- package/esm2022/lib/voice-recorder/voice-recorder.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
- package/esm2022/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +112 -0
- package/esm2022/lib/voice-recording/voice-recording.component.mjs +91 -0
- package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/wave-form-sampler.mjs +1 -1
- package/esm2022/public-api.mjs +82 -0
- package/{fesm2020 → fesm2022}/stream-chat-angular.mjs +857 -1140
- package/fesm2022/stream-chat-angular.mjs.map +1 -0
- package/lib/attachment-list/attachment-list.component.d.ts +2 -5
- package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +2 -2
- package/lib/attachment.service.d.ts +1 -1
- package/lib/avatar/avatar.component.d.ts +4 -4
- package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
- package/lib/channel-list/channel-list.component.d.ts +1 -0
- package/lib/channel-preview/channel-preview.component.d.ts +3 -4
- package/lib/channel.service.d.ts +40 -106
- package/lib/chat-client.service.d.ts +1 -4
- package/lib/custom-templates.service.d.ts +10 -10
- package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +2 -2
- package/lib/message/message.component.d.ts +2 -2
- package/lib/message-actions-box/message-actions-box.component.d.ts +2 -3
- package/lib/message-actions.service.d.ts +1 -1
- package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +2 -2
- package/lib/message-input/message-input.component.d.ts +2 -2
- package/lib/message-input/textarea/textarea.component.d.ts +1 -1
- package/lib/message-input/textarea.directive.d.ts +2 -2
- package/lib/message-list/group-styles.d.ts +1 -1
- package/lib/message-list/message-list.component.d.ts +2 -3
- package/lib/message-reactions/message-reactions.component.d.ts +2 -3
- package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +1 -2
- package/lib/message-text/message-text.component.d.ts +2 -2
- package/lib/modal/modal.component.d.ts +1 -1
- package/lib/notification/notification.component.d.ts +1 -1
- package/lib/notification-list/notification-list.component.d.ts +0 -1
- package/lib/paginated-list/paginated-list.component.d.ts +5 -2
- package/lib/read-by.d.ts +1 -1
- package/lib/types.d.ts +98 -84
- package/lib/user-list/user-list.component.d.ts +1 -1
- package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
- package/lib/voice-recorder/media-recorder.d.ts +2 -2
- package/lib/voice-recorder/transcoder.service.d.ts +4 -4
- package/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.d.ts +0 -1
- package/lib/voice-recorder/voice-recorder.component.d.ts +2 -2
- package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +3 -3
- package/lib/voice-recording/voice-recording.component.d.ts +1 -1
- package/package.json +15 -21
- package/public-api.d.ts +0 -1
- package/src/assets/i18n/en.ts +1 -0
- package/src/assets/version.ts +1 -1
- package/esm2020/lib/attachment-list/attachment-list.component.mjs +0 -224
- package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
- package/esm2020/lib/avatar/avatar.component.mjs +0 -160
- package/esm2020/lib/channel/channel.component.mjs +0 -45
- package/esm2020/lib/channel-header/channel-header.component.mjs +0 -72
- package/esm2020/lib/channel-list/channel-list.component.mjs +0 -47
- package/esm2020/lib/channel-preview/channel-preview.component.mjs +0 -155
- package/esm2020/lib/channel-query.mjs +0 -77
- package/esm2020/lib/channel.service.mjs +0 -1546
- package/esm2020/lib/chat-client.service.mjs +0 -238
- package/esm2020/lib/file-utils.mjs +0 -35
- package/esm2020/lib/message/message.component.mjs +0 -486
- package/esm2020/lib/message-actions-box/message-actions-box.component.mjs +0 -123
- package/esm2020/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +0 -71
- package/esm2020/lib/message-input/message-input.component.mjs +0 -507
- package/esm2020/lib/message-list/message-list.component.mjs +0 -717
- package/esm2020/lib/message-reactions/message-reactions.component.mjs +0 -168
- package/esm2020/lib/message-reactions-selector/message-reactions-selector.component.mjs +0 -61
- package/esm2020/lib/message.service.mjs +0 -43
- package/esm2020/lib/notification-list/notification-list.component.mjs +0 -36
- package/esm2020/lib/paginated-list/paginated-list.component.mjs +0 -94
- package/esm2020/lib/stream-autocomplete-textarea.module.mjs +0 -33
- package/esm2020/lib/stream-textarea.module.mjs +0 -31
- package/esm2020/lib/types.mjs +0 -2
- package/esm2020/lib/virtualized-list.service.mjs +0 -271
- package/esm2020/lib/voice-recorder/mp3-transcoder.mjs +0 -61
- package/esm2020/lib/voice-recorder/transcoder.service.mjs +0 -121
- package/esm2020/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +0 -35
- package/esm2020/lib/voice-recorder/voice-recorder.component.mjs +0 -80
- package/esm2020/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +0 -112
- package/esm2020/lib/voice-recording/voice-recording.component.mjs +0 -91
- package/esm2020/public-api.mjs +0 -83
- package/fesm2015/stream-chat-angular.mjs +0 -9152
- package/fesm2015/stream-chat-angular.mjs.map +0 -1
- package/fesm2020/stream-chat-angular.mjs.map +0 -1
- package/lib/channel-query.d.ts +0 -26
- /package/{esm2020 → esm2022}/lib/format-duration.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/injection-tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-image-attachment.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-on-separate-date.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/is-safari.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/message-input/textarea.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/stream-chat-angular.mjs +0 -0
package/esm2020/lib/types.mjs
DELETED
|
@@ -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==
|